'C++' std::initializer_list

토스트·2025년 4월 25일

'C++' basic

목록 보기
20/35

초기화 리스트(initializer_list)

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>가 참조합니다.

initializer_list 객체 생성 예시

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를 특수화해서 변경하거나 확장하려 하면 프로그램은 잘못된 형식이 됩니다.

0개의 댓글