💻프로그래밍 내용 정리/C++17

[C++ 1.4.1] 직접 리스트 초기화와 복제 리스트 초기화

이이프 2022. 8. 18. 20:04
728x90

이니셜라이저 리스트

이니셜라이저는 다음 두 가지가 있으며, 이니셜라이저 리스트를 중괄호로 묶어서 표현한다.

- 복제 리스트 초기화 ㅣ T obj = {arg1, arg2, ... };

- 직접 리스트 초기화 : T obj {arg1, arg2, ... };

 

 


 

Auto를 이용한 초기화

C++17 부터는 auto 타입 추론 기능과 관련하여 복제 리스트 초기화와 직접 리스트 초기화가 크게 달라졌다.

C++17 이전에는 복제 리스트 초기화와 직접 리스트 초기화 모두 initializer_list<>로 처리했다.

// 복제 리스트 초기화
auto a = {11};     // initializer_list<int>
auto b = {11, 22}; // initializer_list<int>

// 직접 리스트 초기화
auto c {11};     // initializer_list<int>
auto d {11, 22}; // initializer_list<int>

C++17부터 auto는 직접 리스트 초기화에 대해 값 하나만 추론한다.

따라서 이 코드를 실행하면 에러가 발생한다.

// 복제 리스트 초기화
auto a = {11};     // initializer_list<int>
auto b = {11, 22}; // initializer_list<int>

// 직접 리스트 초기화
auto c {11};     // int
auto d {11, 22}; // 원소가 너무 많다는 에러가 발생한다.

복제 리스트 초기화에서 중괄호 안에 나온 원소는 반드시 타입이 같아야 한다.

예를 들면 다음과 같이 작성하면 컴파일 에러가 발생한다.

auto b = {11, 22.33}; // 컴파일 에러