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

Does move constructor have to call std::move()?

我 运行 像这样在我们的项目中插入一些代码:

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()

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

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

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

要允许应用移动语义,您必须获取此左值表达式的结果并通过 std::move 对其进行转换,以便它成为移动语义的右值表达式(无论 data_ 恰好是什么类型)实际应用。

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