移出向量是否保证为空?
一般来说,C 标准对之后的对象状态提供了最低限度的指导他们已被搬离。如 N3485 17.6.5.15 [lib.types.movedfrom]/1 中所述:
C 标准库中定义的类型的对象可以从 (12.8) 移出。移动操作可以显式指定或隐式生成。除非另有规定,此类移出的对象应置于有效但未指定的状态。
虽然此规定并不排除向量受到此行为的影响,但它留下了解释的空间。
Vector 的特定行为
没有明确的标准要求来排除向量受到移出对象的一般规则的影响。然而,考虑到向量实现的要求,选项有限:
移动构造函数:
移动赋值运算符:
情况一:
情况二:
与情况一类似的行为,但分配器不会移动。Case 之间的决定第二种和情况三是在运行时进行的,这会影响对 T 的要求。
唯一的实现方式移动分配是使用分配操作将每个 T 从 v 单独移动到 *this。这要求 T 是 MoveAssignable 或 MoveInsertable(取决于 *this 中容量和大小的可用性)。
结论:对于向量的移动构造函数,移出向量始终为空。对于移动赋值运算符,移出向量通常为空,但在分配器不兼容且 T 为 MoveAssignable 或 MoveInsertable 的某些特定场景中可能不是空的。
以上是移自 `std::vector` 是否保证为空?的详细内容。更多信息请关注PHP中文网其他相关文章!