decltype
이름의 함수처럼 사용됨#include <iostream>
int main()
{
//decltype은 타입을 알고자 하는 식의 타입으로 치환됨
//decltype에 전달된 식이 괄호로 둘러쌓이지 않은 식별자 표현식이라면 해당 식의 타입을 얻을 수 있음
//식별자 표현식: 어떠한 연산을 하지않고 단순히 객체 하나만을 가리키는 식
int a = 3;
decltype(a) b = 2; // a가 int형이니 decltype(a)은 int로 치환됨
int& r_a = a; //a의 레퍼런스를 r_a에 넣어줌
decltype(r_a) r_b = b; // r_a가 int&형이니 decltype(r_a)은 int&형으로 치환됨
return 0;
}
&
연산자 사용 불가std::move(x)
)xvalue
: decltype
은 T&&
lvalue
: decltype
은 T&
prvalue
: decltype
은 T
prvalue
예시 코드itn a, b;
decltype(a + b) c; //a+b식의 실제 타입인 int 로 추론
(a)
는 식별자 표현식이 아님int
로 추론될 것 같지만 int&
로 추론됨int a;
decltype((a)) b;
auto
는 정확한 타입을 표현하지 않음 const
같은 추가 지정자를 읽지 않음const int i = 4;
auto j = i; // int j = i;
decltype(i) k = i; // const int k = i;
int arr[10];
auto arr2 = arr; // int* arr2 = arr;
decltype(arr) arr3; // int arr3[10];
decltype
은 정확한 타입 전달이 가능decltype
과 달리 <utilty>
에 정의된 함수T
의 생성자를 직접 호출하지 않더라도 T
가 생성된 객체를 나타낼 수 있음T()
를 한 것과 같은 효과를 낼 수 있음C++14부터 함수의 리턴타입을 컴파일러가 알아서 유추해주는 기능이 추가되어 함수의 리턴타입을
auto
로 지정해주면 된다. 그렇다고declval
의 쓰임새가 없어진 것은 아니다. 이를 사용해 템플릿 메타프로그래밍 기법을 사용할 수 있다.