template<class T>
class initializer_list;
std::initializer_list<T> 타입의 객체는 const T 타입 객체들의 배열에 접근할 수 있게 해주는 가벼운 프록시 객체입니다.
즉, 실제 데이터를 직접 담고 있는 게 아니라, 그 데이터에 접근하기 위한 간접적인 역할을 합니다.
예시
std::initializer_list<int> il = {1, 2, 3};
위 예시의 {1, 2, 3}를 컴파일러가 내부적으로 const int 배열로 만들고, 이걸 initializer_list<int>가 참조합니다.
1. 중괄호({})로 둘러싼 초기화 목록을 이용해 객체를 리스트 초기화할 때, 그 객체의 생성자가 std::initializer_list를 매개변수로 받을 수 있을 때 자동으로 생성됩니다.
예시
std::vector<int> v = {1, 2, 3}; // initializer_list<int>를 인자로 받는 생성자 호출
2. 중괄호({})로 둘러싼 초기화 목록이 대입문의 우변이나 함수 인자로 사용되고, 그 대입 연산자나 함수가 std::initializer_list를 매개변수로 받는 경우에도 자동으로 생성됩니다.
예시
v = {4, 5, 6}; // initializer_list<int>를 인자로 받는 operator=
myFunc({10, 20, 30}); // 함수가 initializer_list<int>를 인자로 받을 때
3. 중괄호({}) 초기화 목록이 auto 타입에 바인딩될 때, 자동으로 생성됩니다.
예시
for (auto i : {1, 2, 3}) {
std::cout << i << ' ';
}
일반적으로 두 개의 포인터 또는 포인터와 길이로 구현됩니다. 이 객체를 복사하더라도, 원래 데이터를 복사하지는 않습니다.
사용자는 해당 std::initializer_list를 특수화해서 변경하거나 확장하려 하면 프로그램은 잘못된 형식이 됩니다.