移动构造函数是否必须调用std :: move()?

时间:2015-10-07 00:03:59

标签: c++ c++11 move-semantics

我在我们的项目中遇到了一些代码:

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()成员变量?

2 个答案:

答案 0 :(得分:4)

重要的是要记住&#34;左值&#34;和&#34; rvalue&#34;,以及其他&#34; *值的动物园&#34;不适用于变量,而是适用于表达式

表达式obj.data_是一个左值表达式,最简单的方法是考虑&obj.data_格式正确,而取rvalue表达式的地址则不行。

要允许移动语义应用,您必须获取此左值表达式的结果并通过std::move强制转换它,以便它是一个rvalue表达式,移动语义(对于任何类型的data_恰好是)实际应用

因此,是的,您必须申请std::move

答案 1 :(得分:2)

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