例如,如果我们有10个元素向量,并且我们决定擦除第5个元素,则第5个元素之后的所有元素都必须向后移动一个元素。为什么在这里使用赋值运算符?为什么不复制这些位,因为我们知道旧的副本即将被覆盖/无效?
显然,这改变了我们的移动构造函数。我们假设这里没有使用移动构造函数/赋值。
答案 0 :(得分:4)
根本原因是C ++对象可以保留涉及对象(或其子对象)地址的类不变量
因此,如果要在不同的地址建立对象的值,则该类可能需要执行代码以保留不变量。该代码包含移动/复制构造函数/赋值和交换函数(如果适用)。
这种不变量的一个(可能过于复杂)的例子是,“只有一个子对象注册了一些全局指针集合,但哪一个在对象之间变化”。如果您只是复制这些位,那么根据对象状态,没有机会使用“正确”的子对象更新全局集合。
C ++ 03中存在严重的限制,有些类适合于在您描述的情况下复制所有位,但是不适合仅复制副本的所有位一般而言,在您的情况下,副本不必要地昂贵。这个限制是C ++ 11移动语义的地址,使类有机会表现不同。