为什么STL使用赋值操作符在容器中移动项?

Why does the STL use the assignment operator to move items around in containers?

本文关键字:移动 STL 赋值操作符 为什么      更新时间:2023-10-16

例如,如果我们有一个10个元素的向量,我们决定删除第5个元素,那么第5个元素之后的所有元素都必须向后移动一个元素。为什么这里使用赋值操作符?既然我们知道旧的副本即将被覆盖/失效,为什么不直接复制这些位呢?

显然,这改变了move构造函数。我们假设这里没有使用move构造函数/赋值。

根本原因是c++对象可以保留涉及对象(或其子对象)地址的类不变量

因此,如果要在不同的地址建立对象的值,则类可能需要执行代码来保持不变性。这些代码放在move/copy构造函数/赋值函数和swap函数中(如果适用)。

这种不变量的一个(可能过于复杂的)例子是,"只有一个子对象注册到某个指针的全局集合中,但其中一个在对象之间是不同的"。如果您所做的只是复制位,那么就没有机会根据对象状态用"正确的"子对象更新全局集合。

在c++ 03中有一个严重的限制,有些类在你所描述的情况下可以复制所有的位,但在一般情况下,为了复制赋值而复制所有的位是不合适的,在你的情况下,复制是不必要的昂贵的。这个限制是c++ 11移动语义地址,给类机会以不同的行为。