CHAPTER 1. 형식연역
ITEM 2 : AUTO의 형식 연역 규칙을 숙지하라
auto는 한 가지 예외를 제외하고는 템플릿 타입 추론과 동일한 규칙
을 가진다. (item 1의 내용)
auto = 템플릿의 T
타입 지정자 = ParamType 이라고 볼 수 있다.
3.
CHAPTER 1. 형식연역
ITEM 2 : AUTO의 형식 연역 규칙을 숙지하라
auto x = 27;
const auto cx = x;
const auto& rx = x;
1. x의 타입 지정자는 auto 그 자체이다.
2. cx의 형식 지정자는 const auto이다.
3. rx의 형식 지정자는 const auto&이다.
CHAPTER 1. 형식연역
ITEM 2 : AUTO의 형식 연역 규칙을 숙지하라
27을 초기값으로 하는 int를 선언하는 4가
지 구문이다.
이 구문들을 auto로 사용하면 어떻게 될까?
int x1 = 27; // C++98
int x2(27); // C++98
int x3 = { 27 }; // C++11
int x4{ 27 }; // C++11
6.
CHAPTER 1. 형식연역
ITEM 2 : AUTO의 형식 연역 규칙을 숙지하라
auto x1 = 27; // int, 27
auto x2(27); // int, 27
auto x3 = { 27 }; // std::initializer_list<int>, { 27 }
auto x4{ 27 }; // std::initializer_list<int>, { 27 }
auto x5 = { 1, 2, 3.0 }; // ERROR!
// std::initializer_list<T>의 T를 타입 추론할 수 없다.
1. 똑같은 결과를 가지는 4가지 스타일의 구문이 auto에선 다른 타입으로 추론되었다.
2. 중괄호 쌍으로 감싸인 형태(C++11 uniform initialization)는 std::initializer_list<T>로 타입 추론된다.
7.
CHAPTER 1. 형식연역
ITEM 2 : AUTO의 형식 연역 규칙을 숙지하라
auto createInitList() {
return { 1, 2, 3 }; // ERROR!
}
std::vector<int> v;
auto resetV =
[&][const auto& newValue) { v = newValue; }; // C++ 14 lambda
resetV({ 1, 2, 3 }); // ERROR!
1. createInitList의 반환값 {1,2,3}을 타입 추론할 수 없기 때문에 에러가 난다.
2. C++ 14의 람다에서도 마찬가지로 resetV에 넘겨준 {1,2,3}의 타입을 추론할 수 없기 때문에 마찬가지로 에러.
3. 이러한 auto의 용법들은 auto의 타입 추론이 아니라 템플릿 형식 연역의 규칙들이 적용된다.