右值引用,移动语义,完美转发

1.左值引用与右值引用

c++中有左值与右值的概念

一般认为可以取地址的是左值,反之是右值


通常我们可以像这样定义一个引用

int a=1;int &b=a;

此时引用指向一个左值,该引用是一个左值引用

如果使用int &b=1;就会报错

c++还允许使用引用指向右值,即所谓的右值引用

class A{};

int &&b=1;

int &&c=A();//指向一个A类的临时变量

右值引用延长了临时变量的生存时间

2.为什么要引入右值引用

首先回到我们使用左值引用的场景


很多时候我们会将引用作为函数的参数,这样就可以避免调用构造函数,然而这样的方式不适用于

传入一个临时变量


因为1是右值

右值引用使得我们可以传入一个临时变量作为实参。

因为临时变量生存时间很短,实际上每次用完马上就销毁是比较浪费资源的,使用右值引用既可以解决值传递浪费资源的问题,又突破了左值引用只能传左值的限制

右值引用本身是左值还是右值?


常量左值引用既可以指向左值也可以指向右值


3.移动构造函数

通常的复制构造函数是进行一个深拷贝,而移动构造函数是用自己的指针直接指向被复制对象的指针,看上去就像浅拷贝一样,但是他会将被复制对象的指针归零。是一个抢占指针的过程,避免了浅拷贝可能导致的指针悬挂。在很多时候移动构造函数避免了复制构造函数带来的额外的开销。




4.move

move可以将一个左值转为右值


5.完美转发

还记得前面提到的右值引用本身是左值吗

这就导致了,当传入一个右值给右值引用作为参数后,右值引用这个形参本身是左值,当他在作为实参调用其他函数时调用的是左值作为参数的函数。这就产生了不完美转发。


如何解决:

调用forward函数,forward函数会将其转为右值


6.通用引用与引用折叠(暂无)

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容