개요
- 전달된 식의 값 종류에 따른 타입을 컴파일 타임에 추론하여 치환
- 값 종류
- auto의 경우 정확하게 추론하지 않음
예제
- 코드
#include <cstring>
#include <iostream>
#include <string>
using namespace std;
template <typename T> constexpr string type_name() {
const string s = __PRETTY_FUNCTION__;
const int prefixSize = s.find("[with T = ") + strlen("[with T = ");
return string(s.data() + prefixSize, s.find(';') - prefixSize);
}
template <typename T1, typename T2>
void add(T1 t1, T2 t2, decltype(t1 + t2) &result) {
result = t1 + t2;
}
template <typename T1, typename T2>
auto add(T1 t1, T2 t2) -> decltype(t1 + t2) {
return t1 + t2;
}
int main() {
int a = 1;
auto b1 = a;
decltype(a) b2 = a;
cout << type_name<decltype(b1)>() << endl;
cout << type_name<decltype(b2)>() << endl;
cout << "------ 1" << endl;
int &c = a;
auto d1 = c;
decltype(c) d2 = c;
cout << type_name<decltype(d1)>() << endl;
cout << type_name<decltype(d2)>() << endl;
cout << "------ 2" << endl;
int &&e = 3;
auto f1 = e;
decltype(e) f2 = 4;
cout << type_name<decltype(f1)>() << endl;
cout << type_name<decltype(f2)>() << endl;
cout << "------ 3" << endl;
int g = 1, h = 2;
auto i1 = g + h;
decltype(g + h) i2 = g + h;
cout << type_name<decltype(i1)>() << endl;
cout << type_name<decltype(i2)>() << endl;
cout << "------ 4" << endl;
int j = 1;
auto k1 = j;
decltype((j)) k2 = g;
cout << type_name<decltype(k1)>() << endl;
cout << type_name<decltype(k2)>() << endl;
cout << "------ 5" << endl;
const int l = 1;
auto m1 = l;
decltype(l) m2 = l;
cout << type_name<decltype(m1)>() << endl;
cout << type_name<decltype(m2)>() << endl;
cout << "------ 6" << endl;
int result = 0;
add(1, 2, result);
cout << result << endl;
cout << type_name<decltype(add(1, 2))>() << endl;
cout << type_name<decltype(add(1, 1.1))>() << endl;
return 0;
}
- 실행 결과
int
int
------ 1
int
int&
------ 2
int
int&&
------ 3
int
int
------ 4
int
int&
------ 5
int
const int
------ 6
3
int
double