c++11新增了另一种引用 - 右值引用(rvalue reference)。
这种引用可指向右值,使用&&声明
右值引用只能引用临时变量和常量值
在C++中,左值是指表达式结束后依然存在的持久对象,右值是指表达式结束后就不再存在的临时对象.
左值:
1)左值可以取地址
2)左值可以修改
3)左值可以放在等号左右两边
右值:
1)右值不可以取地址
2)右值不可以直接修改
3)右值只能放在等号右边
4)右值往往是没有名称的
关于右值,C++11将右值分了两类:纯右值、将亡值。
纯右值: a) 非引用返回的临时变量; b) 运算表达式产生的结果; c) 字面常量
将亡值: 与右值引用相关的表达式.例如将要被移动的对象,T&&函数的返回值,std::move0的返回值
在左右值使用时有三个原则,不能违反原则,否则编译无法通过:
原则1:右值可以赋给左值,左值不能给右值(左值权限更大)
int a = 3; // a是左值,3是右值
int d = a; // d和a都是左值,左值可以赋给左值
int &&d = a; × // 右值引用左值不行
int &&d = 10; // 右值引用右值可以
int &&d = f(10); // 右值引用右值可以
原则2:右值无法修改
int a = 10; // 10是右值常数,无法修改
原则3:编译器允许为左值建立引用,不可以为右值建立引用
int num = 10;
int &b = num; √ // num是左值,可以左值建立引用
int &b = 10; × // 10是右值,不可以右值建立引用
对右值进行修改——右值引用
1)右值引用必须要进行初始化
2)不能使用左值进行初始化
3)右值引用可以对右值进行修改
int && a; × // 必须初始化
int num = 10;
int && a = num; × //不能使用左值进行右值初始化
int && a = 10; √
int &&a = 10; // 这里的a是右值引用,其实是10
右值引用的本质就是不用拷贝的左值。
引用和右值引用本质的作用都是减少拷贝。右值引用弥补了引用的不足。右值引用提高了传值返回的效率。