鼓励使用以const引用传参代替值传参_右值引用和std:move()

右值rvalues是怎么产生的?

想必你知道,当对象没有命名时,它就是一个右值。一般来说,右值是一个临时的对象,作为函数调用的返回或者其他操作的结果,存在于栈中:

  • 从一个函数调用的返回值会转变成一个右值。也就是说,一旦你调用返回一个对象,但这个对象的命名又从来没有存在过,它就变成了右值。
  • 同样的,调用一个函数会返回一个右值。返回的值没有命名。
61a84a4c7aaad22e173fb012c481186a.png

Move构造函数与右值一起使用

Move构造函数与拷贝构造函数类似。他们从另一个对象构造了一个相同类型的对象。构造函数的参数类型也因此改变,为了之让他接受右值。

下面这是一个拥有move构造函数的示例。它会使得编译器不会生成一个隐式的拷贝构造函数,使得这个类只能move构造。

3e182fa79a1c0460348fd0a1f27bf5d0.png
63515019ab0a2538942c39630d994056.png

move构造函数的参数是一个MyType&&,这是一个引用,就像MyType&,除了它只能绑定一个右值。这也意味着如下的代码不会编译成功,因为,它试图不通过右值来构建一个新的MyType。

d68df2fb5e08a6d9cbc904799d945fb8.png

note: ‘constexpr MyType::MyType(const MyType&)’ is implicitly declared as deleted because ‘MyType’ declares a move constructor or move assignment operator

move构造函数做了浅拷贝

move构造函数,就像拷贝函数一样,是将其他对象中的成员拷贝到自

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值