Возьмите следующий фрагмент кода:
#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>
действительно плохо сформирован?