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

C++ 移动构造函数是否必须调用std::move()?,c++,c++11,move-semantics,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_; }; A

我在我们的项目中遇到了如下代码:

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_;
};
A类{
公众:
A(A&&obj):有效(false),数据(obj.data){
//...
作废打印(){

对于(auto x:data_uu)cout,您需要将
data(obj.data_u)
更改为
data(std::move(obj.data_u))
,否则它将被复制构造;除非显式移动(或在适当条件下转发),否则命名变量永远不会是r值引用“C++”不会隐式地将移动> /COD>传递到对象属性。

< p>您需要更改<代码> DATAAI(Obj.DATAA])/>代码> <代码> DATAAI(STD::Obj.DATAY])/>代码,否则将被复制,除非显式移动(或在适当条件下转发),否则命名变量永远不是R值引用。C++不会隐式地将迁移> /COD>传递到对象属性。

记住“LValk”和“rValm”,以及其他“*值”的“动物园”不适用于变量,而是应用于表达式。 表达式<代码> Obj.DATAA是一个LValk表达式,最简单的方法是考虑<代码>和Obj.DATAA格式良好,而R值表达式的地址不是。

要允许应用移动语义,必须获取此左值表达式的结果,并通过
std::move
将其转换为一个右值表达式,以便移动语义(对于任何类型的数据)实际应用于该右值表达式


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

记住,“左值”和“右值”以及其他“*值”的集合不适用于变量,而适用于表达式

表达式<代码> Obj.DATAA是一个LValk表达式,最简单的方法是考虑<代码>和Obj.DATAA格式良好,而R值表达式的地址不是。

要允许应用移动语义,必须获取此左值表达式的结果,并通过
std::move
将其转换为一个右值表达式,以便移动语义(对于任何类型的数据)实际应用于该右值表达式

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