C++ 移动语义和右值引用

移动语义类似于在计算机中移动文件的情形:实际文件还留在原来的地方,而只修改记录。

例如有一个函数,它返回一个vector<string>对象:

要实现移动语义,需要让编译器知道什么时候需要复制,什么时候不需要。这就是右值引用发挥作用的地方。

可定义两个构造函数,其中一个是常规复制构造函数,它使用const左值引用作为参数,这个引用关联到左值实参,如语句#1中的vstr;另一个是移动复制构造函数,它使用右值引用作为参数,该引用关联到右值实参,如语句#2中的alloc(vstr)的返回值。

复制构造函数可执行深拷贝,而移动构造函数只调整记录。在将所有权转移给新对象的过程中,移动构造函数可能修改其实参,这意味着右值引用参数不应是const。

 

一个移动示例:

 

适用于构造函数的移动语义考虑也适用于赋值运算符。

 

强制移动

移动构造函数和移动复制运算符使用右值。如果让它们使用左值,该怎么办呢?

可使用运算符static_cast<>对象的类型强制转换为unless &&,C++11提供了一种更简洁的方式——使用头文件 utility 中声明的函数 move()。

 

需要知道的是move()并非一定会导致移动操作:

表达式move(one)是右值。如果chunk没有定义移动赋值运算符,编译器将使用复制赋值运算符。如果也没有定义复制赋值运算符,将根本不允许上述赋值。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值