右值引用

右值引用,更多是一种规范,是程序员和编译器的协作。

右值引用的使用,是编译器允许程序员直接访问临时变量(你用右值引用,编译器也常规认为其是临时的,会很快被销毁的对象,可能实际并不是,可能是左值转换过来的),

并不是你用了右值引用,就能直接得到效率的提升的,需要你定义移动构造函数甚至是移动赋值函数,在函数内部,你可以获取得到访问临时变量的能力,而不是通过拷贝得到,

你可以将该临时变量的资源窃取到你新的对象内部(即指针的重新指向),意思是既然你用右值引用,那么该对象就应该是临时对象,会很快被销毁。

但是这种很快被销毁只是我们商议规定的,这完全取决于你的对象的类型,和你是否后续代码中有直接销毁不再使用的操作,仅仅是规定商议,并不是编译器你编写了右值引用,编译器就能直接帮你窃取资源,仅仅是你用右值引用,即在传递参数等临时变量的时候,其会通过移动构造函数传递给你,你能直接访问,而如何窃取是由你决定,而函数调用结束后,也不会自动帮你销毁你传递的变量(取决于你变量本身的生命周期),仅仅是按规定你用右值引用,那么该传递的所谓临时变量后续就不应该使用,因为其内部的资源很可能已经被窃取。


简略意义:

1.有能力获取访问临时变量的能力,const T&常量左值也有

2.让编译器区分开拷贝语义(资源拷贝)和移动语义(资源窃取),可分离出两种不同逻辑方法的实现,保证了单一指责

3.而这控制拷贝还是移动,交由业务方(程序员)来指定。


相关函数:

std::move作用:将一个任意类型的值强制转换为右值。

使用场景:如果你现在为类编写了拷贝构造函数和移动构造函数,那么对于一个左值,可能你想将它交由容器保存,但是自己本身不会再对该引用进行直接使用,均是通过容器来获取,那么你添加到容器后,其实你这个引用对象和内部资源会被销毁,并且容器内部使用的是拷贝构造函数,那么你可能想让编译器对左值进行右值引用的移动语义,便可以使用该函数,将传递给容器的参数变为右值引用,那么编译器便会按照移动语义来执行,但是记住,只是临时改变传递参数的引用类型,本身引用的类型并没有改变,是否销毁还是由引用本身类型决定。


注:

int &&a = 3; //意思是a是一个能够绑定临时变量的引用(右值引用),是一种编译器赋予的能力,但是a本身是一个引用了,后续的作为其他参数使用的时候,是作为左值使用的

参考文章:http://m.blog.csdn.net/shujh_sysu/article/details/52029072

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值