[effective modern c++] 항목 2 : auto 연역 규칙
2016. 3. 1. 19:39ㆍ프로그래밍/Effective Modern C++
728x90
728x90
핵심
- auto 형식 연역은 대체로 템플릿 형식 연역과 같다. 다른 경우는 auto 형신 연역은 중괄호 초기치가
std::initializer_list를 나타낸다고 가정하는 반면 템플릿 형식 연역은 그렇지 않다. 타당한 이유는 없다. 그냥 이렇다.
1 2 3 4 5 6 | auto x = {1,2,3}; // std::initializer_list<int> template<class T> void f(T param); f({1,2,3}); // error | cs |
두 상황의 연역 규칙이 다르다는 것을 꼭 알아두어야 한다고 한다.
- 함수의 반환 형식이나 람다 매개변수에 쓰인 auto에 대해서는 auto 형식 영역이 아니라 템플릿 형식 연역이 적용된다.
1 2 3 4 5 6 7 8 9 10 11 | auto create_init_list() { return {1,2,3}; // error } std::vector<int> v; ... auto resetV = [&v](const auto& newValue) { v = newValue; }; // c++14 ... resetV({1,2,3}); // error | cs |
위 코드의 에러 부분은 {1,2,3}의 형식을 연역할 수 없어 컴파일을 실패한다.
728x90
반응형
'프로그래밍 > Effective Modern C++' 카테고리의 다른 글
[effective modern c++] 항목 6 : auto가 원치 않은 형식으로 연역될 때에는 명시적 형식으로 초기화하자. (0) | 2016.09.10 |
---|---|
[effective modern c++] 항목 5 : 명시적 형식 선언보다는 auto를 선호하라 (0) | 2016.08.14 |
[effective modern c++] 항목 4: 연역된 형식을 파악하는 방법을 알아두자 (2) | 2016.07.16 |
[effective modern c++] 항목 3: decltype의 작동 방식 숙지 (2) | 2016.07.16 |
[effective modern C++] 항목 1 : 템플릿 형식 연역 규칙 숙지 (2) | 2016.03.01 |