移动构造函数是否必须调用 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
。
我 运行 像这样在我们的项目中插入一些代码:
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
。