我在我们的项目中遇到了这样的代码:
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()吗?
发布于 2015-10-07 00:19:48
重要的是要记住,"lvalue“和"rvalue",以及其他”*值“的动物园,并不适用于变量,而是应用于表达式。
表达式obj.data_是一个lvalue表达式,查看这个表达式的最简单方法是考虑&obj.data_格式良好,而使用rvalue表达式的地址则不是。
要允许移动语义应用,您必须使用这个lvalue表达式的结果并通过std::move转换它,以便它是一个移动语义实际应用的rvalue表达式(不管data_类型是什么类型的)。
因此,是的,您必须应用std::move。
发布于 2015-10-07 00:13:49
您需要将data_(obj.data_)更改为data_(std::move(obj.data_)),否则它将被复制构造;除非显式移动(或在适当的条件下转发),否则命名变量永远不是r值引用;C++不会隐式地将move应用于对象属性。
https://stackoverflow.com/questions/32981699
复制相似问题