Почему std::allocator потерял типы/функции-члены в С++ 17?

Глядя на std::allocator, я вижу, что члены:
value_type , pointer, const_pointer, reference, const_reference, size_type, difference_type и rebind устарели.

Распределители также больше не будут иметь членов:
address, max_size, construct или destroy.

Почему это случилось? Было ли это как-то связано с полиморфными распределителями?


person Trevor Hickey    schedule 25.07.2016    source источник
comment
Первый набор членов выглядит так, как будто они действительно подходят для контейнеров, а не для распределителей. Я считаю, что теперь есть std::addressof для замены address(). Кому вообще нужен max_size; а остальные должны быть заменены размещением нового/явного вызова деструктора.   -  person Sam Varshavchik    schedule 25.07.2016
comment
Теперь также есть allocator_traits, который заполнит недостающие части.   -  person Bo Persson    schedule 25.07.2016


Ответы (1)


Если вы посмотрите соответствующий документ isocpp вы можете видеть, что первый набор, который вы упомянули, теперь считается более подходящим для std::allocator_traits . С тех пор, как вышла STL (даже не стандартная библиотека), произошел сдвиг в использовании трейтов.

rebind тоже реликвия. Когда STL впервые появился, псевдонимы и параметры шаблона-шаблона не поддерживались. При наличии этих языковых возможностей rebind кажется довольно запутанным. Например, как вы можете видеть в ответ на этот вопрос, в языке программирования C++, 4-е издание, раздел 34.4.1, с. 998, комментируя «классический» элемент повторной привязки в классе распределителя по умолчанию:

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

Бьерн Страуступр пишет следующее: «Любопытный шаблон повторной привязки — это архаичный псевдоним. Он должен был быть:

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

Однако распределитель был определен до того, как такие псевдонимы стали поддерживаться C++».

Таким образом, в целом стандартная библиотека догоняет изменения языка и парадигмы.

person Ami Tavory    schedule 25.07.2016