左值引用和右值引用的区别?右值引用的意义?
区别:
按照名字:左值引用就是对左值的引用,右值就是对右值的引用
按照功能:
左值引用是为了防止对象的拷贝,
-
函数传参
-
函数返回值(拷贝函数)
右值引用(C++11):
- 实现移动语义
- 实现完美转发
左右值
可以在等号的左边可以取地址为左值,只能在等号右边,不能取地址为右值
左值:
左值是一个数据的表达式(如变量名或引用的指针),我们可以获取到它的地址,正常情况下是可以能够对它赋值,定义const修饰后的左值,不能给它赋值,但是可以取出它的地址。
常见的左值类型如下:
- 变量名
- 返回左值的函数调用
- 前置自增/自减
- 赋值运算或者符合赋值运算
- 解引用
int a = 1 ;//a为左值,a具有地址&a
int i = 0;
++i = 10;//a为左值,因为i具有地址
A *a = new a; //*a,解引用依然是左值
右值:
右值也是一个数据表达式,右值是字面常量或者是求值过程种创建的临时对象,右值的生命周期是短暂的,右值不能出现在赋值符号的左边,右值也不能取出地址,更不能对它赋值。
右值的引用语法:
int&& rra = x +y; //正确
rra = 20; //正确,普通的右值可以被更改
int&& rrb = x; //错误,右值应用不能引用左值
const int&& rrc = 10;
rrc = 20 //错误,const引用不能更改
int&& rrd = rra; //错误,右值的引用不能被别的右值引用
标准库中的move
函数可以将一个左值强制转换为右值
纯右值
- 字面值
- 返回非引用类型的函数调用
- 后置自增自减
- 算数表达式
- 逻辑表达式
- 比较表达式
纯右值的概念等同于我们之前所理解的右值,指的是临时变量或字面量值;而将亡值是C++11新引入的概念,它依托于右值。
- 将亡值
i+&