在我的类中,我使用std::vector等作为成员变量,它们都有自己的移动构造函数。我没有为我的类显式声明移动构造函数,而且它们在大多数情况下也不是隐式声明的。
如果我的类的隐式复制构造函数或隐式赋值运算符是使用rvalue调用的,那么是否复制或移动了具有移动构造函数的成员?
如果它们被移动了,那么在使用带有move可构造成员的类时,有没有理由尝试避免临时成员呢?
发布于 2013-05-17 23:29:06
您的复制构造函数只有一个签名,无论是隐式创建的还是显式声明的,因此编译器无法根据该构造函数的右操作数生成不同的代码。它必须在所有情况下复制可移动属性,因为复制构造函数只有一组代码,必须为所有可能的输入工作。
我认为你的最后一个问题可能与性能有关,但我不能肯定。我建议您编写最明显的代码,让优化器尝试一下。然后分析结果,看看它是否显示临时创建和销毁正在给您带来问题,只有当它们是时,您才应该考虑替代机制。
发布于 2013-05-17 23:03:01
如果您的类没有显式声明移动构造函数/赋值运算符,并且它们也没有被隐式声明,那么隐式声明的copy ctor/assignment-op将不会移动成员,而是复制它们。
如果为您的类隐式声明了move ctor/assignment-op,它们将被移动。你说他们不是--为什么?你的类有自定义析构函数吗?您应该努力设计一种不需要自定义数据函数、复制/移动函数和复制/移动赋值操作的设计--有时称为“零规则”。
如果你确实需要一个定制的dtor,你应该显式地声明move ctor/assignment-op来使用移动语义。如果您的编译器支持它,您可以将它们声明为默认。
https://stackoverflow.com/questions/16612069
复制相似问题