💻프로그래밍 내용 정리/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}; // 컴파일 에러