【问题标题】:Is it OK to move from r-value reference to sub-object of temporary?从 r 值引用移动到临时子对象是否可以?
【发布时间】:2014-10-29 17:16:38
【问题描述】:

如果将临时的Derived 传递给采用Base&& 的方法,是否可以从中移动-构造 Base?

【问题讨论】:

  • 这取决于移动构造对您的Base 类型的影响。如果它使Derived 对象处于有效状态,那么是的。否则,不。
  • 清空子对象对我来说似乎很可疑。封闭对象销毁(在表达式评估结束时)是否正常,子对象为空?
  • 如果您为您的类型编写的移动构造代码使其处于有效状态,那么可以。否则,不。
  • @MikeSeymour:“有效状态”定义不明确。
  • @LightnessRacesinOrbit:我的意思是这个词在任何关于移动语义的讨论中的含义;能够被销毁(并重新分配,如果类型是可分配的)。

标签: c++ move base-class


【解决方案1】:

临时生命周期延长到函数结束(或参数的生命周期,分别),因此您可以从该引用中移动构造 Base 对象。

请注意,您需要一个额外的 std::move 才能使其成为移动而不是副本:

Base b = std::move(param);

您从中移出的临时对象将处于为其类型的移出对象指定的任何状态。像vector<int>string 这样的标准库类型有一个所谓的“有效但未指定的状态”——基本上你可以做的唯一明智的操作是分配(即复制或移动到其中)或销毁它。如果没有关于Base'移动构造函数定义的信息,就无法做出进一步的假设。

【讨论】:

  • 好的,但我担心的不是生命周期,而是整个对象的剩余状态。
  • @haelix 扩展了答案。我仍然不太确定您本质上要问什么——什么是“好的”?
  • @Deduplicator 你的意思是可以将有效但未指定的状态分配给另一个对象?
  • 当然。这也会使其他对象“有效但未指定”。 (顺便说一句:与其说对象具有唯一的“有效但未指定”状态,不如说我们不知道(也不应该关心)它们具有哪种有效状态。)
  • @Deduplicator 我知道这一切。我只是不明白你为什么提到它。在帖子中,我列举了您可以对移动对象执行的 sensible 操作。将它们分配给其他对象是没有意义的,不是吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多