右值和右值引用与std::move()的内在联系是啥,完美转发与引用折叠为何如此难解,一篇博文让你彻底开悟

本文深入探讨了C++中的右值引用、std::move()函数模板的作用以及完美转发的概念。通过理解左值、右值、转发型引用和引用折叠机制,帮助读者掌握如何有效地利用右值提升程序效率。文章详细解析了std::move()和std::forward()在资源管理中的应用,并介绍了它们如何实现对参数的完美转发。
摘要由CSDN通过智能技术生成

右值和右值引用与std::move()的内在联系是啥,完美转发与引用折叠为何如此难解,一篇文章让你彻底开悟

std::move()是一个C++标准模板库的函数模板,它的作用是:输入一个左值对象,输出一个相应的无名右值引用,而无名右值引用本质上就是右值。
上面是从宏观层面进行了理解,现在我的问题是,std::move()函数会对输入的左值对象产生哪些影响?会不会让这个左值对象立刻失效?这句代码执行完后,对刚刚输入的左值对象操作还有效吗?

通常出现这些问题是因为根本没有理解std::move()函数的运行机制。

要想搞清楚这个函数到底做了什么,需要了解一些铺垫性的内容,铺垫行的内容有:左值,左值引用,右值,具名右值引用,转发型引用,引用的折叠机制和static_cast<>()类型转变这些内容。下面进行灵魂介绍:

左值:左值就是程序员实际创建的类型对象,该对象是有变量名的,一旦创建了该类型对象,就会有专属于该对象的内存地址,并且这个对象名会关联到该块内存地址,就不会出现无人认领该块内存的现象,反之,如果我们创建的对象(如new Person但没有用Person*类型的变量名来绑定这一对象)没有被绑定到某一变量名上,则该对象就是一个临时对象,即将被销毁,这个临时对象就是右值对象。

右值:所谓右值,就是不能放到=的左边,即不能被赋值的值。那么顺着这个思路往下捋,什么样的对象不适合被赋值呢?那一定是没有内存地址,或者是有内存地址但是没有变量名绑定在该对象上的对象。例如字符串interesting subject或者字数字110这种字面量,他本是是不能被赋值的,但是可以用来初始化或赋值给左值对象,如int a = 5; const char* str = "Benjamin";a = 100; str = "abc" ;;再就是函数返回的临时对象,虽然这些临时对象可能有内存地址,但也是右值,因为如果没有利用右值引用常量左值引用去绑定接管它,那么返回的该对象会很快被销毁,即便不销毁,由于没有绑定也抓不住该临时对象,编译器对不可使用的临时对象会进行立即销毁,以免占用栈空间内存。

左值引用:左值引用就是来绑定左值对象的,该左值对象本身是有变量名关联该对象地址的,这和具名右值引用不同,具名右值引用只能绑定右值,而右值对象自身是没有变量名与之关联的,所以一旦右值引用本身失效或被销毁,则具名右值引用所绑定的右值对象会立即消失。

右值引用:右值引用本身也是一种引用,它绑定的是临时对象,并不会创建对象。由于绑定临时对象时也使用了变量名,所以右值引用自身是左值,可以被赋值。但是有一点要注意:右值引用所绑定的对象本身是没有变量名的。

记住:

  • 无名的右值引用是右值(这个很好理解,因为即便函数返回了右值引用类型的对象,但该右值引用对象却没有变量名做绑定,那他就是右值)
  • 具名的右值引用是左值(有名字,就是有变量名,那么这个右值引用本身便是左值)

转发型引用:转发型引用出现再函数模板中,这种类型的引用既可以绑定左值,也可以绑定右值,关键是看具体的实参是什么类型,如果实参是左值,则转发行引用会对该实参进行左值绑定。其类型如下:

template<typename T>
void outer(T&& t) // 函数模板的形参列表中的 T&& 就是转发型引用
{
    }

如果传递的实参是右值(临时对象),则转发型引用会对该实参进行右值绑定。所以转发型引用俗称“万能引用”。关于转发型引用的深刻理解,就不得不提“引用折叠”机制,下面进行介绍

引用折叠机制:引用折叠进制是为了进行类型推导,从而能够很好的保障完美转发的实现。想象一下下面的函数模板outer(T&& t)是怎么推导出类型T的是左值引用还是右值或右值引用?没有折叠机制,基本不可能理解。

/// forward
  template<typename _Tp>
    inline _Tp&&
    forward(typename std::remove_reference<_Tp>::type& __t) 
    {
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值