std::vector 移动赋值与移动构造:为什么“其他”的状态不一致?

Jar*_*ith 6 c++ move std move-constructor move-assignment-operator

对于移动构造:

移动后,other 保证为空()。1

对于移动分配,经常引用的:

other 之后处于有效但未指定的状态。2

为什么这两种情况下other的状态不同呢?

bol*_*lov 9

有两种流行的方法可以在容器(如内部保存指向数据的指针的向量)中实现移动:

  • 您可以清空它,然后将指针(以及大小和容量)从其他复制到此,然后将其他成员设置为 nullptr/0
  • 您可以交换数据成员(指针、大小和容量)。

该标准希望为实现这两者留有余地。这些保证是在允许任一实施方法的同时可以做出的最强有力的保证:

  • 移动构造函数:

    • 第一种方法:将其他保留为空状态
    • 第二种方法(交换):将其他保留为空状态
  • 移动分配:

    • 第一种方法:将其他保留为空状态
    • 第二种方法(交换):将 other 作为初始 this 的副本