std:: initializer_list
( member initializer list 와 혼동하지 않음)
|
헤더 파일에 정의됨
<initializer_list>
|
||
|
template
<
class
T
>
class initializer_list ; |
(C++11부터) | |
std::initializer_list<T>
타입의 객체는
const
T
타입의 객체 배열에 대한 접근을 제공하는 경량 프록시 객체입니다(해당 배열이 읽기 전용 메모리에 할당될 수 있음).
A
std::initializer_list
객체는 다음과 같은 경우에 자동으로 생성됩니다:
-
중괄호로 둘러싸인 초기화 리스트가 객체를
목록 초기화
하는 데 사용되며, 해당 생성자가
std::initializer_list매개변수를 받는 경우, -
중괄호로 둘러싸인 초기화 리스트가
할당
의 우측 피연산자로 사용되거나
함수 호출 인자
로 사용되며, 해당 할당 연산자/함수가
std::initializer_list매개변수를 받는 경우, - 중괄호로 둘러싸인 초기화 리스트가 auto 에 바인딩되는 경우( 범위 기반 for 루프 포함).
std::initializer_list
는 한 쌍의 포인터 또는 포인터와 길이로 구현될 수 있습니다.
std::initializer_list
를 복사하는 것은 해당 초기화 리스트의
backing array
를 복사하지 않습니다.
프로그램은
std::initializer_list
의 명시적 또는 부분 특수화를 선언할 경우 형식이 잘못되었습니다.
목차 |
멤버 타입
| 이름 | 정의 |
value_type
|
T
|
reference
|
const T & |
const_reference
|
const T & |
size_type
|
std::size_t |
iterator
|
const T * |
const_iterator
|
const T * |
멤버 함수
|
빈 initializer list를 생성함
(public member function) |
|
Capacity |
|
|
initializer list의 요소 개수를 반환함
(public member function) |
|
Iterators |
|
|
첫 번째 요소를 가리키는 포인터를 반환함
(public member function) |
|
|
마지막 요소의 다음을 가리키는 포인터를 반환함
(public member function) |
|
비멤버 함수
std::begin
를 오버로드
std::begin
(함수 템플릿) |
|
|
(C++11)
|
std::end
를 특수화
std::end
(함수 템플릿) |
|
|
|
(C++14)
|
컨테이너나 배열의 시작 부분에 대한 역방향 반복자를 반환
(함수 템플릿) |
|
(C++14)
|
컨테이너나 배열의 역방향 끝 반복자를 반환
(함수 템플릿) |
|
(C++17)
|
컨테이너가 비어 있는지 확인
(함수 템플릿) |
|
(C++17)
|
기본 배열에 대한 포인터를 얻음
(함수 템플릿) |
참고 사항
| 기능 테스트 매크로 | 값 | 표준 | 기능 |
|---|---|---|---|
__cpp_initializer_lists
|
200806L
|
(C++11) |
목록 초기화
및
std::initializer_list
|
예제
#include <cassert> #include <initializer_list> #include <iostream> #include <vector> template<class T> struct S { std::vector<T> v; S(std::initializer_list<T> l) : v(l) { std::cout << "constructed with a " << l.size() << "-element list\n"; } void append(std::initializer_list<T> l) { v.insert(v.end(), l.begin(), l.end()); } std::pair<const T*, std::size_t> c_arr() const { return {&v[0], v.size()}; // return 문에서의 복사 목록 초기화 // 이는 std::initializer_list의 사용이 아님 } }; template<typename T> void templated_fn(T) {} int main() { S<int> s = {1, 2, 3, 4, 5}; // 복사 목록 초기화 s.append({6, 7, 8}); // 함수 호출에서의 목록 초기화 std::cout << "The vector now has " << s.c_arr().second << " ints:\n"; for (auto n : s.v) std::cout << n << ' '; std::cout << '\n'; std::cout << "Range-for over brace-init-list: \n"; for (int x : {-1, -2, -3}) // auto에 대한 규칙으로 이 범위 기반 for가 작동함 std::cout << x << ' '; std::cout << '\n'; auto al = {10, 11, 12}; // auto에 대한 특별 규칙 std::cout << "The list bound to auto has size() = " << al.size() << '\n'; auto la = al; // 최상위 프록시 객체의 얕은 복사 assert(la.begin() == al.begin()); // 보장됨: 백업 배열이 동일함 std::initializer_list<int> il{-3, -2, -1}; assert(il.begin()[2] == -1); // 존재하지 않는 operator[]의 대체물 참고 il = al; // 얕은 복사 assert(il.begin() == al.begin()); // 보장됨 // templated_fn({1, 2, 3}); // 컴파일러 오류! "{1, 2, 3}"은 표현식이 아니며, // 타입이 없으므로 T를 추론할 수 없음 templated_fn<std::initializer_list<int>>({1, 2, 3}); // OK templated_fn<std::vector<int>>({1, 2, 3}); // 또한 OK }
출력:
constructed with a 5-element list The vector now has 8 ints: 1 2 3 4 5 6 7 8 Range-for over brace-init-list: -1 -2 -3 The list bound to auto has size() = 3
결함 보고서
다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.
| DR | 적용 대상 | 게시된 동작 | 올바른 동작 |
|---|---|---|---|
| LWG 2129 | C++11 |
std::initializer_list
가 명시적
특수화 또는 부분 특수화를 가질 수 있었음 |
이 경우 프로그램은
형식 오류를 가짐 |
참고 항목
|
(C++20)
|
연속된 객체 시퀀스에 대한 비소유 뷰
(클래스 템플릿) |
|
(C++17)
|
읽기 전용 문자열 뷰
(클래스 템플릿) |