临时对象中的成员变量是否可以隐式移动?

时间:2013-05-17 14:54:46

标签: c++ c++11 move-semantics rvalue

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

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

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

2 个答案:

答案 0 :(得分:4)

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

如果为您的类隐式声明了移动ctor / assignment-op,它们将被移动。你说他们不是 - 为什么?你的课程有自定义析构函数吗?你应该努力寻求一种你不需要自定义dtor,复制/移动ctor和复制/移动任务的设计 - 有时称为“零规则”。

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

答案 1 :(得分:0)

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

我认为你的最后一个问题可能与表现有关,但我无法确定。我建议你编写最明显的代码,让优化器对它进行破解。然后对结果进行概要分析,看看它是否显示临时创建和销毁对您造成了问题,并且只有在它们出现时才应考虑其他机制。