我在我们的项目中遇到了一些代码:
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()
成员变量?
答案 0 :(得分:4)
重要的是要记住&#34;左值&#34;和&#34; rvalue&#34;,以及其他&#34; *值的动物园&#34;不适用于变量,而是适用于表达式。
表达式obj.data_
是一个左值表达式,最简单的方法是考虑&obj.data_
格式正确,而取rvalue表达式的地址则不行。
要允许移动语义应用,您必须获取此左值表达式的结果并通过std::move
强制转换它,以便它是一个rvalue表达式,移动语义(对于任何类型的data_恰好是)实际应用
因此,是的,您必须申请std::move
。
答案 1 :(得分:2)
您需要将data_(obj.data_)
更改为data_(std::move(obj.data_))
,否则它将被复制;除非明确移动(或在适当条件下转发),否则命名变量永远不会是r值引用; C ++不会隐式地将move
传递给对象属性。