decltype(<타입을 나타내는 식>)
decltype은 () 안의 식이 나타내는 타입으로 치환되어 타입을 알아내거나 혹은 같은 타입으로 선언, 참조 등을 할 때 용이하다.
#include <iostream>
using namespace std;
int main() {
decltype(1) num0 = 10; // int
decltype(num0) num1 = 20; // int
decltype(num1)& num2 = num1; // int&
const decltype(num0) num3 = 10; // const int
const decltype(num0)& num4 = num2; // const int&
const decltype((num0)) num5 = num0; // int&
decltype(1 + 22.2f) num6 = 1.f; // float
decltype(auto) num7 = 70; // int
int nums0[] = { 1, 2, 3 };
decltype(nums0) nums1 = { 10, 20, 30 }; // int[3]
}
decltype(auto) num7 = 70;
decltype의 식에 auto를 넣어도 type추론을 통해 num7을 int로 선언할 수 있다.
decltype(func) f
func의 받는 인자와 반환 타입을 f가 받게 된다.
하지만 statement는 받지 않기 때문에 f에 대한 statement를 따로 작성해야 한다.
#include <iostream>
using namespace std;
int func(float) {
return 10;
}
int f(float) {
return 200;
}
struct Person {
float weight;
float height;
};
int main() {
decltype(func) f; // int f(float)
cout << f(10.f) << endl;
decltype(func)& f0 = func;
cout << f0(10.f) << endl;
decltype(func)* f1 = func;
cout << f1(10.f) << endl;
decltype(func(1.f)) num7 = 20;
Person p;
decltype(p.weight) weight; // float
decltype(Person::height) height; // float
}
실행 결과
200
10
10
decltype의 ( ) 안의 식은 실제로 작동하지 않는다.