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

发布于 2025-01-09 11:53:25 字数 395 浏览 2 评论 0原文

对于移动构造:

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

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

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

为什么other 这两种情况有什么不同?

For move construction:

After the move, other is guaranteed to be empty(). 1

For move assignment, the oft-quoted:

other is in a valid but unspecified state afterwards. 2

Why is the state of other different in these two cases?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

一抹苦笑 2025-01-16 11:53:25

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

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

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

  • 移动构造函数:

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

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

There are 2 popular ways to implement move in containers like vector that internally hold a pointer to the data:

  • you can empty this, then copy the pointer (and size and capacity) from other to this and then set other members to nullptr/zero
  • you can swap the data members (the pointers, size and capacity).

The standard wants to leave leeway to implementations to do either. These guarantees are the strongest guarantees it can make while allowing either methods of implementation:

  • move constructor:

    • 1st method: leaves other in empty state
    • 2nd method (swap): leaves other in empty state
  • move assignment:

    • 1st method: leaves other in empty state
    • 2nd method (swap): leaves other as a copy of initial this
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文