C/C++的左值和右值与其应用

左值是指可被引用的数据对象(就是说有变量名,可用地址访问),如变量(常规变量和const变量)、数组无素、结构成员、引用和解除引用的指针。

非左值包括字面常量(”Hello World!”由地址表示除外)和包含多项表达式:

1
x + 3 = 5.0;  //It's wrong

左右值最常出现的地方是什么呢?
这要涉及到C++的一个临时变量的问题,临时变量产生条件:当实参与引用参数不匹配,C++将产生临时变量。也就是说引用传参的本来目的,改变传入变量的值会失效,而变成使用临时变量,相当于引用参数是const引用。

什么时候创建临时变量呢?

  1. 实参的类型正确,但不是左值;(x+10或7.0);
  2. 实参的类型不正确,但可以转换为正确的类型;
所以综上所述,对于引用参数声明我们要尽可能地使用const

在这里顺便提一下C++11的新引用 ——右值引用(&&)!

来段实例代码:

1
2
3
double && rref = std::sqrt(36.00);   //右值不能用 double&
double j = 15.0;
double && jref = 2.0 * j + 18.5; //右值不能用 double&