우변 수식이 가진 참조, const , volatile 속성을 제거하고, 타입을 결정함.
int 변수, int& 변수, const int 변수, const int & 변수를 초기화하고,
이를 auto 받아서 타입조사를 해보아라.
우변 수식이 가진 ref속석만 제거하고, const, volatile 속성은 유지됨.
-> 타입에 ref가 있으니까 ref 타입임.
: 위의 내용을 코드를 통해 확인해보아라.
: decltype( 변수, 또는 연산자, )
괄호안의 수식이 lvalue라면 참조, 아니면 값 타입으로 결정됨.
관련 코드
: 밑의 코드를 따라 따라 쳐보자...
int main()
{
int n = 0;
int* p = &n;
decltype(n) d1; // int // n = 10;
decltype(p) d2; // int*
// (수식) : 수식이 lvalue라면 참조, 아니면 값 타입
decltype(*p) d3; // *p = 10; int&
decltype((n)) d4; // (n) = 10; int&
decltype(n + n) d5; // n+n = 10 가 될수 없다. int
decltype(++n) d6; // ++n = 10; ok.. int&
decltype(n++) d7; // n++ = 10; error. int
int x[3] = { 1,2,3 };
decltype(x[0]) d8; // x[0] = 10; ok int&
auto a1 = x[0]; // int
}
int x = 10;
int& foo(int a, int b)
{
return x;
}
int main()
{
auto ret1 = foo(1, 2); // int
// 평가되지 않는 표현식(unevaluated expression)
// foo 함수의 반환값은 int&이므로,
// ret2는 int& 타입으로 타입이 결정됨.
decltype( foo(1, 2) ) ret2 = foo(1,2); // int&
// C++14
decltype(auto) ret3 = foo(1, 2); // int&
}