Auto with decltype (C++14)
decltype 의 인수로 auto가 올 수 있으며, auto의 타입의 추론 방식이 template 이 아닌 decltype 을 따릅니다.
#include <iostream>
int referenceInt = 1;
int& getReferenceValue()
{
return referenceInt;
}
int main(int argc, const char * argv[])
{
auto autoVar = getReferenceValue();
decltype(auto) declVar = getReferenceValue();
printf("%s %s\n",typeid(autoVar).name(),typeid(declVar).name());
printf("%p %p %p\n",&referenceInt,&autoVar,&declVar);
return 0;
}
i i
0x100001020 0x7fff5fbff76c 0x100001020
getReferenceValue 함수는 referenceInt 의 Reference 를 넘깁니다. auto 와, decltype(auto) 로 받은 변수의 포인터 값을 찍어보면 위의 예제와 같은 결과를 얻을 수 있습니다.
auto 의 경우 typeid 가 int 이지만 포인터가 다르므로 int 타입으로 추론 되었습니다. (template argument deduction rules)
decltype(auto) 는 typeid 가 int 이면서 기존 변수와 포인터 값이 같기 때문에, int& 타입으로 추론 되었습니다. (decltype deduction rules)
함수 반환 자료형 자리에도 decltype(auto) 를 사용할 수 있으며, 함수 리턴값에 의해 반환 자료형이 추론되는 방식이 바뀝니다.