auto는 한가지 예외를 제외하고 템플릿과 형식 연역 방식이 같다.
auto x = 27; // 경우 3
const auto cx = x; // 경우3
const auto& rx = x; // 경우1
auto&& uref1 = x; // uref: int&
auto&& uref2 = cx; // uref: const int&
auto&& uref3 = 27; // uref: int&&
const char name[] = "R. N. Briggs"; // name의 형식은 const char[13]
auto arr1 = name; // arr1: const char*
auto& arr2 = name; // arr2: const char (&) [13]
void someFunc(int, double);
auto func1 = someFunc; // func1 : void (*) (int, double)
auto& func2 = someFunc; // func2 : void (&) (int, double)
예외는 균일 초기화에서 생기는데,
다음은 모두 값이 27인 int가 생긴다.
int x = 27;
int x2(27);
int x3 = {27};
int x4{27};
하지만 다음과같이 auto를 쓰면,
auto x = 27;
auto x2(27);
auto x3 = {27};
auto x4{27};
위 두개는 27인 int가 생기는 효과가 있지만,
밑의 두개는 27인 원소를 담은 std::initializer_list<int>형식의 변수를 선언한다.
이는 {}의 해석이 균일초기화와 배열 두가지로 될수 있기 때문인데, auto는 이중 후자를 택한다.
따라서
auto x5 = { 1, 2, 3.0};
과 같이 원소들의 자료형이 다르면 컴파일이 되지 않는다.
반면 템플릿에서는 이런식의 매개변수 전달은 불가능 하다.
template<typename T>
void f(T param);
f({1,2,3}); --> 컴파일 에러
하지만 다음과 같은 경우는 가능하다.
template<typename T>
void f(std::initializer_list<T> initList);
f({1,2,3); --> T는 int로 연역됨.
c++14에서 제공하는 함수의 반환형식을 auto로 선언하는 경우에도
반환값을 중괄호 형식으로 주면 위와같이 컴파일 에러가 난다.
auto createInitList()
{
return { 1, 2, 3 };
}