c++ 左值引用与右值引用——原
左值和右值
综述
C++对于左值和右值没有标准定义,但是有一个被广泛认同的说法:
可以取地址的,有名字的,非临时的就是左值;——变量、返回引用、const 不能取地址的,没有名字的,临时的就是右值;——10、函数返回值
可见立即数(10),函数返回的值(.没名字、临时值)等都是右值; 而非匿名对象(包括变量),函数返回的引用,const对象等都是左值。
详细
1、左值指既能够出现在等号左边,也能出现在等号右边的变量; 右值则是只能出现在等号右边的变量。
int a;
a = 3;
2、左值是可寻址的变量,有持久性; 右值一般是不可寻址的常量,或在表达式求值过程中创建的无名临时对象,短暂性的。
3、值和右值主要的区别之一是左值可以被修改,而右值不能。
左值引用和右值引用
传统左值引用
int a = 10;
int &b = a;
b = 20;
int &var = 10;
因为10无法进行取地址操作,无法对一个立即数取地址,因为立即数并没有在内存中存储,而是存储在寄存器中,可以通过下述方法解决: CPU内部用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果。(调用函数运算后存储的值)
const int &var = 10;
使用常引用来引用常量数字10,因为此刻内存上产生了临时变量保存了10,这个临时变量是可以进行取地址操作的,因此var引用的其实是这个临时变量,相当于下面的操作:
const int temp = 10;
const int &var = temp;
右值引用
定义右值引用的格式如下:
类型 && 引用名 = 右值表达式;
|