C++11新标准 decltype类型说明符
decltype的作用是选择并返回操作数的类型,编译器分析表达式得到它的类型,但不计算
1. 函数
decltype(func()) val=i;
decltype(func()) 编译器并不会调用该函数,而是得到该函数的返回类型
2.顶层const
decltype会保留顶层const和引用类型
const int i=10,&j=20;
decltype(i) x=0;
decltype(j) y=x;
decltype(j) z;
这一点与auto是完全相反,auto会忽略掉变量的顶层const,而decltype会保留顶层const
3.decltype使用的结果是表达式(非单一变量)
在此之前 先说明左值和右值的概念
C语言中,左值表示的是可以放在赋值‘=’左边的表达式(右边也可以),而右值是只能放在‘=’的右边
C++中含义不同,简单来说若一个表达式的可以取地址,说明它是一个左值,若不能取地址说明是一个右值
例如r+0,3.14,*p都不能取地址,表达式结果是一个临时变量,说明它们是一个右值
当一个对象用作左值,用的是它的身份(内存中的位置),当一个对象用的是右值,用的是它的值(内容)
int i=42,*p=&i,&r=i;
decltype(r+0) b;
decltype(*p) c;
decltype(i) d;
decltype((i)) e;
r+0是一个右值 返回运算结果的类型int
报错 *p是一个左值表达式 返回类型int& 由于未初始化所以非法
decltype(i)返回i变量的类型,而decltype((i))返回int& 因为(i)被视作表达式(非单一常量),是左值