为什么STL使用赋值运算符在容器中移动项目?

时间:2014-03-30 17:01:53

标签: c++ stl

例如,如果我们有10个元素向量,并且我们决定擦除第5个元素,则第5个元素之后的所有元素都必须向后移动一个元素。为什么在这里使用赋值运算符?为什么不复制这些位,因为我们知道旧的副本即将被覆盖/无效?

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

1 个答案:

答案 0 :(得分:4)

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

因此,如果要在不同的地址建立对象的值,则该类可能需要执行代码以保留不变量。该代码包含移动/复制构造函数/赋值和交换函数(如果适用)。

这种不变量的一个(可能过于复杂)的例子是,“只有一个子对象注册了一些全局指针集合,但哪一个在对象之间变化”。如果您只是复制这些位,那么根据对象状态,没有机会使用“正确”的子对象更新全局集合。

C ++ 03中存在严重的限制,有些类适合于在您描述的情况下复制所有位,但是不适合仅复制副本的所有位一般而言,在您的情况下,副本不必要地昂贵。这个限制是C ++ 11移动语义的地址,使类有机会表现不同。