[Effective modern cpp] 右值引用、移动语义和完美转发

std::move 和 std::forward

Note: std::move 不进行任何移动,std::forward 也不进行任何转发,它们仅仅执行强制型别转换的函数。std::move无条件地将实参强制转换成右值,而std::forward则尽在某个特定条件满足时才执行同一个强制转换。在运行期,二者不会做任何操作。
所有函数形参皆为左值。

区分万能引用和右值引用

1、如果函数模板形参具备T&&型别,并且T的型别系推导而来,或如果对象使用auto&&声明其型别,则该形参或对象就是个万能引用。
2、如果型别声明并不精确地具备type&&的形式,或者型别推导并未发生,则type&&就代表右值引用。
3、若采用右值来初始化万能引用,就会得到右值引用。若采用左值来初始化万能引用,就会得到一个左值引用。

RVO(返回值优化)

返回值优化需满足以下条件:
1、局部对象型别和函数返回值型别相同;
2、返回的是局部对象本身;
若编译器不选择进行复制省略,返回对象必须作为右值处理。

引用折叠

1、如果任一引用为左值引用,则结果为左值引用。否则(即两个皆为右值引用),结果为右值引用。
2、万能引用推导左值T的结果为左值引用类型T&,推导右值T结果为类型T。
3、引用折叠发生的语境有四种:
(1)模板实例化
(2)auto型别生成
(3)创建和运用typedef和别名声明
(4)decltype

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值