Устаревание std :: allocator <void>

Связано: Почему стандартные контейнеры требуют, чтобы allocator_type :: value_type был типом элемента?

Говорят, что после С++ 17 было отказано:

template<>
struct allocator<void>;

Интересно, устарел ли он, потому что только один первичный шаблон способен разместить allocator<void>, или прецедент использования allocator<void> устарел.

Если последнее, интересно, почему. Я думаю, что allocator<void> полезен при указании распределителя, не привязанного к определенному типу (так что просто некоторые схемы/метаданные).

Ответы

Ответ 1

Согласно p0174r0

Аналогичным образом, std::allocator<void> определяется так, что в исходной библиотеке С++ 98 могут работать различные трианкировки шаблонов шаблона, но это не фактический распределитель, поскольку ему не хватает как allocate и deallocate функции-члены, которые невозможно синтезировать по умолчанию из allocator_traits. Эта необходимость ушла с С++ 11 и псевдонимами типа void_pointer и const_void_pointer в allocator_traits. Тем не менее, мы продолжаем указывать его, чтобы не нарушать старый код, который еще не был обновлен для поддержки общих распределителей, на С++ 11.