转载:C++ decltype类型推导完全攻略 (biancheng.net)
转载:C++中左值和右值的理解 - 知乎 (zhihu.com)
左右值重点:
1.如果是左值的话可以直接取到地址,右值就不行。
比如:
int a = 3,b=3; //a,b为 左值,3为右值
int *addr =&a; //a可以取到地址,&3就不行了
int *addr =&(a+b); //a+b是右值,这样编译器会报错。
2.左值可以被修改,右值不可以被修改
decltype类型推导重点:
1.decltype和auto很相似。但是decltype是根据它包含的值推导的,可独立存在,而auto必须有等式,auto是根据等式右边推导出来的。
比如:
int a=10;
decltype<a> data; //decltype可以单独存在
auto data = a;//auto必须需要是等式
2.decltype 有三条规则(转载的文章表达的有问题)
decltype(exp)
- 1.表达式为普通变量或者普通表达式或者类表达式,在这种情况下,使用decltype推导出的类型和表达式的类型是一致的。
- 2.如果 exp 是函数调用,那么 decltype(exp) 的类型就和函数返回值的类型一致。
- 3.如果 exp 是一个左值,或者被括号
( )
包围,那么 decltype(exp) 的类型就是 exp 的引用;假设 exp 的类型为 T,那么 decltype(exp) 的类型就是 T&。
值得注意的是int *a; decltype<*a>, *a是左值, int *ddd = &(*a); 可以取到地址。所以decltype<*a>符合规则3