为什么在C++17中std::allocator失去了成员类型/函数?

23

在查看 std::allocator 时,我发现以下成员已被弃用:
value_typepointerconst_pointerreferenceconst_referencesize_typedifference_typerebind

分配器也不再拥有以下成员:
addressmax_sizeconstruct 或者 destroy

为什么会这样呢?这与多态分配器有关吗?


3
第一组成员似乎更适合容器,而不是分配器。我相信现在有一个std::addressof可以替换address()了。谁需要max_size呢?其余部分应该可以通过就地new/显式析构函数调用进行替换。 - Sam Varshavchik
2
现在还有一个allocator_traits,它将填补缺失的部分。 - Bo Persson
1个回答

19

如果你看一下相关的isocpp论文,你会发现你提到的第一个集合现在被认为更适合放在std::allocator_traits中。自STL(甚至标准库)发布以来,使用traits的趋势已经更加明显。

rebind也是一种遗留物。当STL首次发布时,别名和模板模板参数不受支持。有了这些语言特性,rebind似乎相当复杂。例如,正如你可以在这个问题的答案中看到的,第4版《C++程序设计语言》第34.4.1节第998页中评论默认分配器类中“传统”的重新绑定成员:

template<typename U>
     struct rebind { using other = allocator<U>;};

巴尼·斯特劳斯特普写道:“奇怪的rebind模板是一个古老的别名。它应该是:”
template<typename U>
using other = allocator<U>;

然而,在C++支持这些别名之前,分配器已经被定义了。因此,总的来说,这是标准库赶上语言和范式变化的过程。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接