decltype是一种新的操作符,用于获取表达式的数据类型。
使用方法和sizeof操作符类似。
int i;
decltype(i) x1; // 类型为int
const int bar();
decltype(bar()) x2; // 类型为int
const int&& foo();
decltype(foo()) x3; // 类型为const int&&
struct A { double x; };
const A* a = new A();
decltype(a->x) x4; // 类型为double
decltype( (a->x) ) x5; // 类型为const double&
decltype( e ) 返回类型前,进行了如下推导:
- 若表达式e为一个无括号的变量、函数参数、类成员访问,那么返回类型即为该变量或参数或类成员在源程序中的“声明类型”;
- 否则的话,根据表达式的值分类(value categories),设T为e的类型:
- 若e是一个左值(lvalue,即“可寻址值”),则返回T&;
- 若e是一个临终值(xvalue),则返回T&&;
- 若e是一个纯右值(prvalue),则返回T。
上述最后一个例子中,带括号的表达式(a->x)既非“标识符表达式”,亦非类访问表达式,因而未指向一个命名对象,而是一个左值,于x5便为“指向表达式类型的引用”,亦即const double&。
参考来源
wiki - decltype