首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >move构造函数必须调用std::move()吗?

move构造函数必须调用std::move()吗?
EN

Stack Overflow用户
提问于 2015-10-07 00:03:59
回答 2查看 54关注 0票数 1

我在我们的项目中遇到了这样的代码:

代码语言:javascript
复制
class A {
public:
  A(A&& obj): valid_(false), data_(obj.data_) {}
  //...
  void print() {
    for (auto x : data_) cout<<x<<" ";
    cout<<endl;
  }
private:
  bool valid_;
  vector<int> data_;
};

这是移动构造函数的有效实现吗?在这种情况下,移动构造函数中的成员变量必须使用std::move()吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-07 00:19:48

重要的是要记住,"lvalue“和"rvalue",以及其他”*值“的动物园,并不适用于变量,而是应用于表达式。

表达式obj.data_是一个lvalue表达式,查看这个表达式的最简单方法是考虑&obj.data_格式良好,而使用rvalue表达式的地址则不是。

要允许移动语义应用,您必须使用这个lvalue表达式的结果并通过std::move转换它,以便它是一个移动语义实际应用的rvalue表达式(不管data_类型是什么类型的)。

因此,是的,您必须应用std::move

票数 4
EN

Stack Overflow用户

发布于 2015-10-07 00:13:49

您需要将data_(obj.data_)更改为data_(std::move(obj.data_)),否则它将被复制构造;除非显式移动(或在适当的条件下转发),否则命名变量永远不是r值引用;C++不会隐式地将move应用于对象属性。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32981699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档