左值是指可被引用的数据对象(就是说有变量名,可用地址访问),如变量(常规变量和const变量)、数组无素、结构成员、引用和解除引用的指针。
非左值包括字面常量(”Hello World!”由地址表示除外)和包含多项表达式:
1 | x + 3 = 5.0; //It's wrong |
左右值最常出现的地方是什么呢?
这要涉及到C++的一个临时变量的问题,临时变量产生条件:当实参与引用参数不匹配,C++将产生临时变量。也就是说引用传参的本来目的,改变传入变量的值会失效,而变成使用临时变量,相当于引用参数是const引用。
- 实参的类型正确,但不是左值;(x+10或7.0);
- 实参的类型不正确,但可以转换为正确的类型;
所以综上所述,对于引用参数声明我们要尽可能地使用const
在这里顺便提一下C++11的新引用 ——右值引用(&&)!
来段实例代码:
1 | double && rref = std::sqrt(36.00); //右值不能用 double& |