首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >临时对象中的成员变量是否会在可能的情况下隐式移动?

临时对象中的成员变量是否会在可能的情况下隐式移动?
EN

Stack Overflow用户
提问于 2013-05-17 22:54:46
回答 2查看 176关注 0票数 6

在我的类中,我使用std::vector等作为成员变量,它们都有自己的移动构造函数。我没有为我的类显式声明移动构造函数,而且它们在大多数情况下也不是隐式声明的。

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

如果它们被移动了,那么在使用带有move可构造成员的类时,有没有理由尝试避免临时成员呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-17 23:29:06

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

我认为你的最后一个问题可能与性能有关,但我不能肯定。我建议您编写最明显的代码,让优化器尝试一下。然后分析结果,看看它是否显示临时创建和销毁正在给您带来问题,只有当它们是时,您才应该考虑替代机制。

票数 0
EN

Stack Overflow用户

发布于 2013-05-17 23:03:01

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

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

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16612069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档