6

在我的类中,我使用std::vectoretc. 作为成员变量,它们带有自己的移动构造函数。我没有为我的类显式声明移动构造函数,并且它们大部分都没有隐式声明。

如果我的类的隐式复制构造函数或隐式赋值运算符使用右值调用,具有移动构造函数的成员是复制还是移动?

如果它们被移动,在使用具有移动可构造成员的类时,是否有任何理由避免使用临时对象?

4

2 回答 2

4

如果您的类没有显式声明移动构造函数/赋值运算符并且它们也没有隐式声明,那么隐式声明的复制 ctor/assignment-op 将不会移动成员,而是复制它们。

如果为您的班级隐式声明了 move ctor/assignment-op,它们将被移动。你说他们不是——为什么?你的类有自定义析构函数吗?您应该争取一种不需要自定义 dtor、复制/移动 ctor 和复制/移动分配操作的设计 - 有时称为“零规则”。

如果确实需要自定义 dtor,则应显式声明 move ctor/assignment-op 以使用移动语义。如果您的编译器支持它,您可以将它们声明为默认值。

于 2013-05-17T15:03:01.233 回答
0

无论是隐式创建还是显式声明,您的复制构造函数都只有一个签名,因此编译器无法根据该构造函数的右手操作数生成不同的代码。它必须在所有情况下复制可移动属性,因为复制构造函数只有一组代码必须适用于所有可能的输入。

我认为您的最后一个问题可能与性能有关,但我无法确定。我建议您编写最明显的代码,然后让优化器对其进行破解。然后分析结果并查看它是否表明临时创建和破坏给您带来了问题,只有当它们是您才应该考虑替代机制。

于 2013-05-17T15:29:05.903 回答