为什么propagate_on_container_move_assignment不适用于容器的复制构造函数

问题描述 投票:0回答:1

我已经阅读了一些关于 propagate_on_container_move_assignment 的旧帖子来了解它是如何工作的,但仍然无法理解一些更精细的点。根据我的理解,移动构造函数以简单的方式工作(移动构造分配器以及任何内部状态),但是移动赋值运算符需要处理分配器何时可以传播。

以下问题中的答案有两个链接,提供了有关分配器传播如何工作以及为什么需要它的一些背景知识

从上述链接复制 -

容器移动赋值运算符必须处理三个单独的 可能性:

  • propagate_on_container_move_assignment 为 true。
  • propagate_on_container_move_assignment 为 false,并且来自 lhs 和 rhs 的分配器比较相等。
  • propagate_on_container_move_assignment 为 false,左侧和右侧的分配器比较不相等。

我理解前两种情况,但是,对于第三种情况“propagate_on_container_move_assignment 是假的,来自 lhs 和 rhs 的分配器比较不相等。” 我不明白这对于移动构造函数来说不是一个问题。在移动分配的情况 3 中,我们最终会复制数据,因为我们无法拥有 rhs 分配器的内存。在移动构造期间,我们假设我们始终可以拥有内存,并且只需移动构造分配器以及内部状态即可。如果这在移动构造函数中是可能的,那么我们不能在移动分配中做类似的事情 - 移动分配分配器并移动分配内部状态。

对我来说,如果情况 3 对于移动赋值为真,那么这意味着我们在没有“传播”检查的情况下实现的移动构造函数将是格式错误的。

请帮助我理解这个概念。最好提供一个示例,其中对于移动分配,由于分配器不支持传播,我们采用第三种情况(分配器应该有一个不支持 pocma = std::true_type 的正当理由),但移动构造函数有效?

谢谢,

c++ containers allocator
1个回答
0
投票

C++98 不要求分配器可分配(事实上有些分配器不提供

operator=
)。为了向后兼容,库不能使用赋值运算符,除非分配器说可以这样做。

© www.soinside.com 2019 - 2024. All rights reserved.