Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从r值引用移动到临时对象的子对象可以吗?_C++_Move_Base Class - Fatal编程技术网

C++ 从r值引用移动到临时对象的子对象可以吗?

C++ 从r值引用移动到临时对象的子对象可以吗?,c++,move,base-class,C++,Move,Base Class,如果一个临时的派生的被传递给一个采用基的方法&&,那么可以从该方法移动构造基吗?临时的生存期被延长到函数结束(或参数的生存期),因此您可以从该引用移动一个基对象 请注意,您需要一个附加的std::move,以使其成为移动而不是副本: Base b = std::move(param); 从中移动的临时对象将处于为其类型的“从中移动”对象指定的任何状态。标准库类型,如vector或string具有所谓的“有效但未指定的状态”——基本上,您可以执行的唯一合理操作是分配(即复制或移动到其中)或销毁它

如果一个临时的
派生的
被传递给一个采用
基的方法&&
,那么可以从该方法移动构造基吗?

临时的生存期被延长到函数结束(或参数的生存期),因此您可以从该引用移动一个
对象

请注意,您需要一个附加的
std::move
,以使其成为移动而不是副本:

Base b = std::move(param);

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

这取决于移动构造对您的
Base
类型的影响。如果它使
派生的
对象保持有效状态,则为“是”。否则,不会。对我来说,清空子对象似乎是可疑的。对于空的子对象,封闭对象销毁(在表达式求值结束时)是否正常?如果为类型编写的移动构造代码使其处于有效状态,则为“是”。否则,就不会了。@MikeSeymour:“有效状态”的定义太模糊了。@LightnessRacesinOrbit:我指的是这个词在任何关于移动语义的讨论中的含义;可以被销毁(如果类型是可分配的,则可以重新分配)。好的,但我担心的不是生存期,而是完整对象的剩余状态。@haelix扩展了答案。我仍然不太确定您到底在问什么——什么应该是“ok”?@重复数据消除器您的意思是可以将有效但未指定的状态分配给另一个对象?当然。这将使另一个对象也“有效但未指定”。(顺便说一句:并不是说对象有唯一的“有效但未指定”状态,而是我们不知道(也不应该关心)它们有哪个有效状态。)@Deduplicator我知道所有这些。我只是不明白你为什么提到它。在这篇文章中,我列举了可以对“从对象移动”执行的合理操作。将它们分配给其他对象是没有意义的,不是吗?