根据当前标准(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
进行比较。有没有理由在移动分配上移动这些默认分配器?
答案 0 :(得分:3)
我正在回答相对于C ++ 11,正如您在标记中指出的那样:
如果特征不成立,则分配操作需要对分配器是否相等执行运行时检查。是的,当然分配器总是相同的,但是代码不知道并且仍然必须执行检查,因此您不能提供noexcept保证。如果POCMA = true,您可以静态地知道您将窃取资源,因此不会抛出。
C ++ 14使std::allocator
具有POCMA = true(在LWG2103中)。在C ++ 11中它是错误的。
C ++ 17引入了新的特征is_always_equal
(在N4258中),即使POCMA为假,也允许操作的非抛出异常规范。
(我认为公平地说,分配器的设计从未完全完成,直到今天,没有人完全确定它们应该如何工作。)