C++/Effective Modern C++
[Effective Modern C++] 항목 2. auto의 형식 연역 규칙을 숙지하라
pppgod
2019. 8. 25. 16:22
auto 의 형식 연역 규칙은 template 과 거의 모든 부분이 일치한다. 그러므로 항목 1을 먼저 보기를 추천한다.
template 과 차이가 생기는 부분은 바로 균일 초기화(Uniform initialization)를 사용하는 경우이다.
int x1 = 27;
int x2(27);
int x3 = { 27 }; // Uniform initialization
int x4{ 27 }; // Uniform initialization
여기서 int 를 auto 로 변경해보자.
auto x1 = 27; // int
auto x2(27); // int
auto x3 = { 27 }; // std::initializer_list<int>
auto x4{ 27 }; // std::initializer_list<int>
x3 과 x4 처럼 균일 초기화를 하는 경우에는 int 가 아닌 std::initializer_list 의 형태로 타입이 지정되는 것을 볼 수 있다. 추측이지만 초기화하는데 사용한 중괄호의 의미가 컴파일러가 해석하기에 모호하기 때문에 발생하는 것으로 보인다.
2014년 11월에 직접 초기화 구문을 이용한 경우에는 std::initializer_list 로 받지 않게 되었다. 즉 x4 의 경우에는 현재 int 로 타입이 지정된다. 컴파일러에 따라 다른 결과가 나타날 수 있으니 주의하자
참고 서적
스콧 마이어스, Effective Modern C++