Является ли контейнер STL const T с пользовательским распределителем некорректным? - PullRequest
5 голосов
/ 22 марта 2019

Возьмите следующий фрагмент кода:

#include <vector>

std::vector<int> good;

//illegal, because std::allocator<const T> is ill-formed
std::vector<const int> bad;

//fails to compile under MSVS 2017
std::vector<const int, my_custom_allocator> X;

Почему X не компилируется? MSVS 2017 показывает

Ошибка C2338 (сбой статического утверждения): Стандарт C ++ запрещает контейнеры с константными элементами, поскольку распределитель некорректен.

Насколько я понимаю, это не обязательно правильно.

Согласно 20.5.3.5 [allocator.requirements] (и много SO вопросов ), распределитель const T плохо сформирован - но, насколько я понимаю, он Также возможно определить распределитель, который работает только с одним типом (имеется в виду не шаблонный распределитель). Это позволяет избежать, хотя и слегка педантичным образом, языкового ограничения. Насколько я понимаю, поскольку шаблоны создаются во время компиляции, значение по умолчанию для распределителя вектора (т. Е. std::allocator<const T>) никогда не создается, и поэтому последняя строка не нарушает это правило.

Игнорирование вариантов использования и альтернатив (и того факта, что const std::vector<int>, вероятно, решает вашу проблему), и с учетом действительного my_custom_allocator: действительно ли std::vector<const int, my_custom_allocator> действительно плохо сформирован?

1 Ответ

4 голосов
/ 22 марта 2019

Я думаю, что это все еще будет плохо сформировано. Согласно [allocator.requirements] , распределитель должен работать с объектами типа T, который определен как

любой cv - неквалифицированный тип объекта

Исходя из этого, мне кажется, что все, что работает с const T, не может удовлетворять требованиям быть распределителем и, следовательно, не может использоваться в качестве распределителя для стандартного контейнера & hellip;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...