背景
在 C++ 中 auto 用于变量类型的自动推断:在声明变量的时候,根据变量初始值的类型自动为此变量选择匹配的类型,而不需要显示指定类型。 但是 auto 所修饰的变量必须被初始化,编译器需要通过初始化来确定auto 所代表的类型,即必须要定义变量。 如果仅希望得到类型,则需要使用 C++ 中另一个关键字:decltype 。
decltype
decltype 用于推导类型,对于一个给定的变量名或者表达式,decltype 能够返回其类型。 同 auto 一样,decltype 的自动类型推断发生在编译器,但 decltype 不会真正计算表达式的值。
decltype 类型推导规则
①.decltype 和变量 对于变量,decltype 会把变量的 const 属性、引用属性& 都返回。
const int x = 0;
const int& y = z;
int arr[5] = {0};
int *ptr = arr;
decltype(x) a = 1;
decltype(y) b = a;
decltype(arr) var1;
decltype(ptr) var2;
②.decltype 和表达式 若表达式的值是一个右值,则返回其值的类型。
decltype(10) a = 1;
decltype(a+3) b = 0;
decltype(b++) c = 10;
若表达式的值是一个左值,则返回其引用类型。
int i = 3;
int arr[5] = {0};
int *ptr = &i;
decltype(true ? i:i ) var1 = 3;
decltype(++i) var2 = 2;
decltype(arr[2]) var3 = 3;
decltype(*i) var4 = 0;
decltype("hello") var5 = "hello";
decltype((i)) var6 = 1;
③.decltype 和函数 若表达式是一个函数,则返回函数的返回值类型,但并不调用该函数。
int& func1();
int&& func2();
decltype(func1()) a = 0;
decltype(func2()) b = 0;
若表达式是一个函数名,则返回函数类型。
int& func();
decltype(func) f;
decltype 的使用
①.推导变量类型
using size_t = decltype(sizeof(0));
vector<int> vec;
typedef decltype(vec.begin()) veciter;
②.提取函数类型
int& func();
function<decltype(func)> tmp = func;
③.重用匿名类型
enum class{
A,B,C
} en;
decltype(en) m_en;
④.尾置函数返回类型
auto func() ->int;
⑤.模板编程中类型推导
template<typename T1,typename T2>
auto Sum(T1 &t1,T2 &t2) -> decltype(t1+t2)
{
return t1+t2;
}
|