[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
반응형