繁体   English   中英

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

[英]Move assignment on containers: state of previously contained objects

来自另一个问题 (实际上是这个 问题 ,但是前一个是更好的参考),除了20.5.5.15,我在标准中找不到合适的参考:

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

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

例:

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与源目标的元素交换来实现,但是很可能是通过调整大小然后移动来完成的。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM