C++ 左值引用与右值引用的作用及实现原理

定义及作用

左值:表示对象的身份,生命周期持久。 对左值的修改实际上就是对对象的修改。
右值:表示对象的值,生命周期短暂。

左值引用的设计直接原因就是方便运算符重载。 比如对于+运算符的重载如果没有引用会写成 A operator +(const A *a, const A *_a); ,使用要写成&a+&b,而有了引用可以直接写成A operator +(const A &a, const A &_a);a+b,语法更简洁,也不容易出错。 引用由于要初始化并且不能更改绑定对象,也解决了空指针和野指针等问题,但也有能使用指针但不能使用引用的场合:比如传递函数指针。

右值引用意义主要体现为两大作用:实现移动语义 完美转发。
下面一个一个来讲:

移动语义

一些情况下对象拷贝后就被销毁了,使用移动而不是拷贝可以提升性能。 比如vector的增长,没有移动语义之前是复制并删除,其实只要移动就好了。 再比如unique_ptr放入容器,没有移动语义之前由于vector增长需要复制对象,像unique_ptr这种不可复制对象不能存入容器。

实现细节
移动操作的实现有两点需要注意:

  • 对移动拷贝,赋值函数需要指明noexcept,不然编译器为了异常安全会优先选择拷贝操作。
  • 移后源对象要处于有效,可析构状态。

转发实现原理

转发用于将函数一个或多个实参传递给另一个函数,在此情况下,不管被传递函数形参是怎样的,我们希望实参和被传函数里的实参性质相同(const,左值,右值)。 这是通过引用折叠和std::forward做到的。

引用折叠
引用折叠只能应用于间接创建的引用的引用,如类型别名,模板参数推断。
讲引用折叠之前我们需要先了解模板实参推断是如何得到引用的引用:

template <typename T> void f(T&);	//左值引用函数参数
f(i);	//传递左值,i是int类型, T是int
f(ci);	//传递const左值 T是const int
f
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值