来自another question(实际上是this one,但前者是更好的参考),除了20.5.5.15,我在标准中找不到合适的参考:


  C ++标准库中定义的类型的对象可以从(15.8)中移出。移动操作可以显式指定或隐式生成。除非另有说明,否则此类移出的对象应置于有效但未指定的状态。


对先前包含在目标容器中的元素是否有任何要求,例如G。在作业之前被销毁?

例:

std::list<SomeClass> v1({10, 12});
std::list<SomeClass> v2({7});
v1 = std::move(v2);
for(auto sc : v2)
{
    std::cout << sc << ' ';
}


尽管GCC根本不输出任何内容(std::vectorstd::list一样),但会收到10 12作为合法的输出(提供了适当的operator<<)(例如,仅通过交换内容即可接收,尤其是以前不删除对象包含)?

到现在为止,我会说“是”,但对于要依靠它的把握还不够确定,并且好奇不提出问题...

如果合法,如果元素没有立即销毁,那么对于任何开发人员来说,这是否会是意外的(例如,结果是某些资源仍保持打开状态,而开发人员期望它们会关闭)?

最佳答案

[container.requirements.general]中,我们看到


  a的所有现有元素都已被移动分配或销毁。
  确保:a应等于rv在此之前的值
  分配。


其中a是目的地,而rv是右值。这可以通过与源目标的元素交换1来实现,但是很可能是通过调整大小然后移动来完成的。


必须通过非专用__swap来确保确实发生了移动分配。

关于c++ - 在容器上 move 分配:先前包含的对象的状态,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52698679/

10-11 23:06
查看更多