右值引用的语法定义
传统的C++引用(&)使得标识符关联到左值。传统的作指示一个表达式,程序可以获取变量的地址,然后申请一个空间。而C++11的新标准中新增了右值引用 ,使用&&来表示。
左值的英文简称是lvalue,右值的英文简称是rvalue,这并不是left value 和right value的简称,而分别是locator value的缩写,意思是在内存中可明确寻址的的数据。 而rvalue指的是read value,也就是那些可以提供数据值的数据。简单来讲,可以通过两种方法来判断左值和右值:
- 通过“=”来判断,通常在=左边的就是左值,而右边则是右值。
- 通过判断是否能取地址来判断。能进行取地址处理的,则是左值,反之是右值。
在c98标准中,无法对右值进行引用,只能对左值进行引用。
举一个简单的例子:
int a=10;
int &b=a; //正确
int &c=10; //错误
const int &c=10; //正确
int &&d=10; //右值引用,正确
注意在使用右值引用的时候,和声明左值一样,右值引用也必须对变量进行初始化,且只能使用右值初始化。
int a=10;
int &&b=a; //错误,左值初始化
int &&c=10; //正确,右值初始化
c=100; //正确,c的值被修改
右值引用的使用场景
移动语义
在之前的C++中,要复制一个对象,只能调用拷贝构造函数把这些所有的内存复制一遍发送过去。而移动语义,就是将原本的内存块保存起来,让另一块内存和此块内存相关联,而不是以拷贝构造的方式传送。简单来讲,移动语义就是将一些临时资源的内存占为己用,提高效率,降低了临时对象开销内存之后又释放内存的开销。
而实现移动语义,就是让编译器直到什么时候复制,什么时候不需要,这恰好需要右值引用来发挥作用。