在容器上移动分配:先前包含的对象的状态

时间:2018-10-08 08:56:35

标签: c++ stl move-semantics

来自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<<)(例如,只是交换内容,尤其是删除先前包含的对象)?

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

如果合法,如果元素没有立即被销毁(例如,结果某些资源仍处于打开状态,而开发人员期望它们被关闭),那么对于任何开发人员来说,这都是不可预料的吗?

1 个答案:

答案 0 :(得分:1)

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

  

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

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

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