C++11新特性之decltype
1.decltype的作用
decltype是C++11新增的一个关键字,与auto的功能一样,都是在编译期间推导变量类型的。不了解auto的可以转到——C++11新特性之auto。
为什么引入decltype?看过上边那篇博客的读者应该知道auto在有些场景中并不适用,所以引入decltype就是为了解决这个问题。
2.decltype的用法
decltype的用法与auto是不同的(可以对比上面博客auto用法):
decltype(exp) name = value;
其中,name为变量名,value为赋给变量的值,exp是个表达式。
(1)decltype根据exp表达式推导变量的类型。
(2)decltype不要求变量必须初始化。(因为都用不到变量值)
3.exp的注意事项
exp的返回值必须是有类型的。例如返回整形、浮点型等,不能返回void。
int a =1;
decltype (a) b = 1; //b的类型推导为intdouble c = 1.1
decltype(c) d = 1.2; //d的类型推导为double
decltype(c+1) e; //e的类型推导为double,并且不需要初始化
根据exp表达式的值推导出变量的类型,并且不需要初始化。
4.decltype的推导规则
使用decltype(exp)获取类型是,编译器将根据以下三条规则推导出结果:
(1)如果 exp 是一个不被括号( )包围的表达式,或是一个类成员访问表达式,或是一个单独的变量,那么 decltype(exp) 的类型就和 exp 一致,这是最普遍最常见的情况。
(2)如果 exp 是函数调用,那么 decltype(exp) 的类型就和函数返回值的类型一致。
(3)如果 exp 是一个左值,或者被括号( )包围,那么 decltype(exp) 的类型就是 exp 的引用;假设 exp 的类型为 T,那么 decltype(exp) 的类型就是 T&。
第一条与第二条比较容易理解,主要解释下第三条。
首先解释一下左值与右值。
左值:表达式执行结束后依然存在的数据,即持久性数据。
右值:表达式执行结束后就销毁不再存在的数据,即临时性数据。
一种简单的辨别方法,可以对表达式取地址,不报错就是左值,否者为右值。
下边举个例子:
int a =0,b = 1;decltype(a+b) c = 3; //这个是右值,按规则一推导出类型为intdecltype(a = a+b) d = 4; //这个是左值,按规则三推导出类型为int&
a+b这个表达式的数据在表达式执行完就销毁了,所以它是右值。
a = a+b这个表达式的数据在表达式执行完数据存到a的地址中,能对其取地址,所以它为左值。推导结果为 int& 。
5.decltype的具体应用
就是在auto不能用的地方用decltype(exp)。例如在类中定义的静态变量等。但是能用auto的地方推荐用auto(用起来更简单)。
6.总结
decltype相当于是对auto的一个补充,功能基本一样,在使用过程中可以自行选择。