难道移动的构造要调用的std ::移动()?

问题描述 投票:1回答:2

我跑进我们的项目像这样的代码:

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()成员变量在移动构造函数必须的?

c++ c++11 move-semantics
2个回答
4
投票

重要的是要记住,“左值”和“右值”,和其他“*值”的动物园适用不变量是很重要的,但表情。

表达obj.data_是一个左值表达式,并看到这是考虑到&obj.data_很好地形成,而服用右值表达式的地址是不是最简单的方法。

为了让移动语义应用,你一定要把这个左值表达式的结果,并通过std::move投它,以便它是一个右值表达式到移动语义(无论何种类型data_中恰好是)实际应用。

所以,是的,你必须申请std::move


2
投票

你需要改变data_(obj.data_)data_(std::move(obj.data_))否则就会被复制建造的;命名变量是从未r值的引用,除非明确地移动(或在适当的条件下转发); C ++不会隐式应用move及物动词到对象属性。

© www.soinside.com 2019 - 2024. All rights reserved.