为什么std :: allocator需要propagate_on_container_move_assignment为真?

时间:2017-02-05 12:13:57

标签: c++ c++11 allocator

根据当前标准(20.7.9),std::allocator的成员propagate_on_container_move_assignment设置为true_type

  

模板类分配器
  {
    市民:
      typedef size_t size_type;
      typedef ptrdiff_t difference_type;
      typedef T *指针;
      typedef const T * const_pointer;
      typedef T&参考;
      typedef const T&为const_reference;
      typedef T value_type;
      template struct rebind {typedef allocator other; };
       typedef true_type propagate_on_container_move_assignment;
       typedef true_type is_always_equal;
      [...]

std::allocator没有数据成员,并且始终与其他任何std::allocator进行比较。有没有理由在移动分配上移动这些默认分配器?

1 个答案:

答案 0 :(得分:3)

我正在回答相对于C ++ 11,正如您在标记中指出的那样:

如果特征不成立,则分配操作需要对分配器是否相等执行运行时检查。是的,当然分配器总是相同的,但是代码不知道并且仍然必须执行检查,因此您不能提供noexcept保证。如果POCMA = true,您可以静态地知道您将窃取资源,因此不会抛出。

C ++ 14使std::allocator具有POCMA = true(在LWG2103中)。在C ++ 11中它是错误的。

C ++ 17引入了新的特征is_always_equal(在N4258中),即使POCMA为假,也允许操作的非抛出异常规范。

(我认为公平地说,分配器的设计从未完全完成,直到今天,没有人完全确定它们应该如何工作。)