首页  >  文章  >  后端开发  >  移自 `std::vector` 是否保证为空?

移自 `std::vector` 是否保证为空?

Susan Sarandon
Susan Sarandon原创
2024-11-18 03:04:02266浏览

 Is a Moved-From `std::vector` Guaranteed to Be Empty?

移出向量是否保证为空?

一般来说,C 标准对之后的对象状态提供了最低限度的指导他们已被搬离。如 N3485 17.6.5.15 [lib.types.movedfrom]/1 中所述:

C 标准库中定义的类型的对象可以从 (12.8) 移出。移动操作可以显式指定或隐式生成。除非另有规定,此类移出的对象应置于有效但未指定的状态。

虽然此规定并不排除向量受到此行为的影响,但它留下了解释的空间。

Vector 的特定行为

没有明确的标准要求来排除向量受到移出对象的一般规则的影响。然而,考虑到向量实现的要求,选项有限:

移动构造函数:

  • 移动构造函数必须具有恒定的复杂性。
  • 唯一的选择是从源向量 (v) 中窃取资源来构造新向量,使 v 为空。

移动赋值运算符:

  • 行为取决于向量的分配器:

情况一:

  • allocator_traits::propagate_on_container_move_assignment::value == true
  • 目标向量 (*this) 中的所有元素都被破坏。
  • 使用 *this 中的分配器释放容量。
  • 分配器和内存缓冲区所有权从 *this 转移v 到 *this。
  • *在移动分配之前,这通常是空的。

情况二:

  • allocator_traits
  • allocator_traits
  • allocator_traits
  • A>::propagate_on_container_move_assignment::value == false 且 get_allocator() == v.get_allocator()

与情况一类似的行为,但分配器不会移动。Case 之间的决定第二种和情况三是在运行时进行的,这会影响对 T 的要求。

唯一的实现方式移动分配是使用分配操作将每个 T 从 v 单独移动到 *this。这要求 T 是 MoveAssignable 或 MoveInsertable(取决于 *this 中容量和大小的可用性)。

结论:

对于向量的移动构造函数,移出向量始终为空。对于移动赋值运算符,移出向量通常为空,但在分配器不兼容且 T 为 MoveAssignable 或 MoveInsertable 的某些特定场景中可能不是空的。

以上是移自 `std::vector` 是否保证为空?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn