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

Move assignment on containers: state of previously contained objects

本文关键字:包含 对象 状态 移动 分配      更新时间:2023-10-16

来自另一个问题(实际上,而是这个问题,但前一个是更好的参考(,除了 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,以确保移动任务确实发生。