右值引用的作用:实现移动语义和完美转发
下面解释这两个含义。
1.先从右值定义的角度来看
什么是左值?就是一个指向某一块内存空间的表达式或者变量,可以取地址。
什么是右值?右值就是非左值的表达式
2.什么是移动语义?
一般来说,我们给一个对象赋值的时候,会把源对象进行一个复制,然后把源对象的副本赋值给目的对象,之后销毁源对象。有了移动语义之后,就可以避免没有必要的复制和销毁操作,直接把源对象移动给目的对象,这就是移动语义。
3.什么是完美转发?
3.1对于一些函数形参,直接引用右值的话会行不通,需要加上const关键字,但这种转发就把参数固定死了,没办法修改,这就是不完美转发,如图1和图2所示为不完美的转发:
3.2用右值引用可以解决这个问题,实现完美转发,也就是说完美转发后可以对参数的值进行修改了,如图3所示:
以上如何验证?
4.用下面的实验验证:
4.1下面这幅图说明test()和test01()里面的a是占用同一块内存的变量,说明是右值引用。
4.2下面这幅图说明test()和test01()里面的a是占用不同的内存,说明是普通传值,不是转发。
4.3下面的图说明右值不能直接当成左值引用。
4.4下面的三幅图说明了b=test01(10)里面的10在test01()的作用下变成了左值。