我跑进我们的项目像这样的代码:
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()
成员变量在移动构造函数必须的?
重要的是要记住,“左值”和“右值”,和其他“*值”的动物园适用不变量是很重要的,但表情。
表达obj.data_
是一个左值表达式,并看到这是考虑到&obj.data_
很好地形成,而服用右值表达式的地址是不是最简单的方法。
为了让移动语义应用,你一定要把这个左值表达式的结果,并通过std::move
投它,以便它是一个右值表达式到移动语义(无论何种类型data_中恰好是)实际应用。
所以,是的,你必须申请std::move
。
你需要改变data_(obj.data_)
到data_(std::move(obj.data_))
否则就会被复制建造的;命名变量是从未r值的引用,除非明确地移动(或在适当的条件下转发); C ++不会隐式应用move
及物动词到对象属性。