1、什么是左值和右值?
- 左值就是:非临时的变量,是有名字的,是可以取地址的
- 右值就是:临时的变量,没有名字的,不能取地址的
- 例如:int a = b + c ,a 就是左值,其变量名为 a ,通过 &a 可以取得该变量的地址;而表达式 b + c 和函数返回值 int fun() 就是右值,在其被赋值给某一变量前,我们不能通过变量名找到它,&(b + c) 这样的操作则不会通过编译。
- 所以一般来说,临时值,函数返回值,立即数这些都属于右值;而非匿名对象(非临时变量),以引用返回的函数值(相当于函数返回值的临时变量定义为引用),const常量都属于左值
2、左值引用
int a = 10;
int &b = a;
b = 20;
- 由于左值引用是对左值的引用,那么该值一定是可以取地址的
- 但是,如果无法取地址,可以用常引用。但使用常引用后,我们只能通过引用来读取数据,无法去修改数据,因为其被 const 修饰成常量引用了。
const int& c = 10;
3、右值引用
- 右值引用是 C++11 新增的特性,右值引用会将新变量绑定到右值,绑定到右值以后,本来会被销毁的右值的生存期会延长到与新变量的生存期一样。
- 定义右值引用的格式如下:
类型 && 引用名 = 右值表达式;
int &&c = 10;
参考链接:https://zhuanlan.zhihu.com/p/97128024