C++11decltype类型指示符

来源:互联网 发布:荣耀盒子pro 软件 编辑:程序博客网 时间:2024/04/28 22:30

C++11引入类型说明符decltype,作用是选择并返回操作数的数据类型,在此过程中,编译器分析表达式并得到它的类型,却不计算表达式的值:

decltype(f()) sum = x;          //sum的类型就是函数f返回的类型

编译器并不实际调用函数f,而是返回f调用发生时的返回类型作为sum的类型。

decltype与const

decltype处理const和引用的方式与auto有些不同。如果decltype使用的表达式是一个变量,则其返回类型为变量的类型(包括顶层const与引用在内):

const int ci = 0, &cj = ci;decltype(ci) x = 0;             //x的类型是const intdecltype(cj) y = x;             //y的类型是const int &,y绑定到xdecltype(cj) z;                 //错误,z是一个引用,应当初始化

引用从来都是作为其所指对象的同义词出现,只有在decltype处是一个例外。

decltype和引用

如果decltype的表达式不是一个变量,则decltype返回表达式结果对应的类型。

int i = 42, *p = &i, &r = i;decltype(r + 0) b;              //正确,加法的结果是int,因此b是一个未初始化的intdecltype(*p) c;                 //错误,c是int&,必须初始化

r是一个引用,因此decltype(r)的结果仍然是一个引用类型,如果想让结果是r所指的类型,则 可以把r作为表达式的一部分,如r+0,这个表达式的结果是一个具体的值而非引用。
如果一个表达式是解引用操作,则decltype将得到引用类型。解引用指针可以得到指针所指的对象,而且还能给这个对象赋值,因此decltype(*p)的类型就是int &而非int。

decltype与表达式形式

decltype的结果类型与表达式形式密切相关。如果decltype使用的是一个不加括号的变量,则得到的结果类型就是该变量的类型。而如果加上了一层或者多层括号,编译器会将其当成一个表达式。变量是一种可以作为赋值语句左值的特殊表达式,所以decltype就会得到引用类型:

int i = 42;decltype((i)) d;                //错误,d是引用,必须初始化decltype(i) e;                  //正确,e是一个为初始化的int

decltype((variable))的结果永远都是引用。

原创粉丝点击