繁体   English   中英

move构造函数是否必须调用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_;
};

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

重要的是要记住,“ lvalue”和“ rvalue”以及其他“ * values”的形式并不适用于变量,而适用于表达式

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

要允许应用移动语义,您必须获取此左值表达式的结果,并通过std::move对其进行强制转换,以便它是一个右值表达式,该值实际上适用于移动语义(对于任何data_碰巧的类型)。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM