![](/img/trans.png)
[英]Does the move constuctor of std::vector call the move constructor of the items
[英]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.