右值引用,更多是一种规范,是程序员和编译器的协作。
右值引用的使用,是编译器允许程序员直接访问临时变量(你用右值引用,编译器也常规认为其是临时的,会很快被销毁的对象,可能实际并不是,可能是左值转换过来的),
并不是你用了右值引用,就能直接得到效率的提升的,需要你定义移动构造函数甚至是移动赋值函数,在函数内部,你可以获取得到访问临时变量的能力,而不是通过拷贝得到,
你可以将该临时变量的资源窃取到你新的对象内部(即指针的重新指向),意思是既然你用右值引用,那么该对象就应该是临时对象,会很快被销毁。
但是这种很快被销毁只是我们商议规定的,这完全取决于你的对象的类型,和你是否后续代码中有直接销毁不再使用的操作,仅仅是规定商议,并不是编译器你编写了右值引用,编译器就能直接帮你窃取资源,仅仅是你用右值引用,即在传递参数等临时变量的时候,其会通过移动构造函数传递给你,你能直接访问,而如何窃取是由你决定,而函数调用结束后,也不会自动帮你销毁你传递的变量(取决于你变量本身的生命周期),仅仅是按规定你用右值引用,那么该传递的所谓临时变量后续就不应该使用,因为其内部的资源很可能已经被窃取。
简略意义:
1.有能力获取访问临时变量的能力,const T&常量左值也有
2.让编译器区分开拷贝语义(资源拷贝)和移动语义(资源窃取),可分离出两种不同逻辑方法的实现,保证了单一指责
3.而这控制拷贝还是移动,交由业务方(程序员)来指定。
相关函数:
std::move作用:将一个任意类型的值强制转换为右值。
使用场景:如果你现在为类编写了拷贝构造函数和移动构造函数,那么对于一个左值,可能你想将它交由容器保存,但是自己本身不会再对该引用进行直接使用,均是通过容器来获取,那么你添加到容器后,其实你这个引用对象和内部资源会被销毁,并且容器内部使用的是拷贝构造函数,那么你可能想让编译器对左值进行右值引用的移动语义,便可以使用该函数,将传递给容器的参数变为右值引用,那么编译器便会按照移动语义来执行,但是记住,只是临时改变传递参数的引用类型,本身引用的类型并没有改变,是否销毁还是由引用本身类型决定。
注:
int &&a = 3; //意思是a是一个能够绑定临时变量的引用(右值引用),是一种编译器赋予的能力,但是a本身是一个引用了,后续的作为其他参数使用的时候,是作为左值使用的
参考文章:http://m.blog.csdn.net/shujh_sysu/article/details/52029072