C++11之decltype

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容