2016-07-25 138 views
12

虽然看着std::allocator,我看到成员:
value_typepointerconst_pointerreferenceconst_referencesize_typedifference_typerebind都被弃用。为什么std :: allocator在C++ 17中失去成员类型/函数?

分配器也将不再有成员:
addressmax_sizeconstruct,或destroy

为什么会发生这种情况?它是否与多态分配器有关?

+1

第一组成员看起来像是真的对容器有意义,而不是分配器。我相信现在有一个'std :: addressof'来代替address()。无论如何,谁需要max_size;其余部分应该可以通过放置新的/显式的析构函数调用来替换。 –

+1

现在还有一个['allocator_traits'](http://en.cppreference.com/w/cpp/memory/allocator_traits),可以填写缺失的部分。 –

回答

9

如果你看看the relevant isocpp paper你可以看到你提到的第一组现在被认为是更好地放置在std::allocator_traits。由于STL(甚至没有标准库)出来,所以有更多的使用特征的转变。

rebind也是遗物。当STL第一次出现时,不支持别名和模板模板参数。有了这些语言功能,rebind似乎相当复杂。例如,你可以在an answer to this question中看到,在C++编程语言第4版第34.4.1节, 998,评论在默认allocator类的“经典”重新绑定成员:

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

比亚Stroustupr写道的:“好奇的重新绑定模板是一种过时的别名,它应该是:

template<typename U> 
using other = allocator<U>; 

然而,在C++支持这些别名之前定义了allocator。“

因此,总的来说,它是标准图书馆追赶语言和范式的转变。

相关问题