Является ли std :: vector <T> `пользовательским типом`?
В 17.6.4.2.1 / 1 и 17.6.4.2.1 / 2текущий проект стандарта ограничения наложены на специализации, введенные пользователями вnamespace std
.
Поведение программы на C ++ не определено, если она добавляет объявления или определения в пространство имен std или в пространство имен в пространстве имен std, если не указано иное. Программа может добавить специализацию шаблона для любого стандартного шаблона библиотеки в пространство имен std, только если объявление зависит отпользовательский тип и специализация соответствует стандартным требованиям библиотеки для оригинального шаблона и явно не запрещена.
Не могу найти где в стандарте фразупользовательский тип определено.
Один из вариантов, о которых я слышал, это то, чтоstd::is_fundamental
этопользовательский тип, в таком случаеstd::vector<int>
будетпользовательский тип.
Альтернативный ответ был бы, чтопользовательский тип это тип, который определяет пользователь. Как пользователи не определяютstd::vector<int>
, а такжеstd::vector<int>
не зависит от типа, определенного пользователем,std::vector<int>
это непользовательский тип.
Практическая проблема, на которую это влияет: «Можете ли вы ввести специализацию дляstd::hash
заstd::tuple<Ts...>
вnamespace std
? Быть способным сделать это несколько удобно - альтернатива состоит в создании другого пространства имен, в котором мы рекурсивно создаем наш хеш дляstd::tuple
(и, возможно, другие типы вstd
которые не имеютhash
поддержки), и если и только если нам не удастся найти хеш в этом пространстве имен, мы будем использоватьstd
.
Однако, если это законно, то если и когда стандарт добавляетhash
специализация дляstd::tuple
вnamespace std
код, специализирующий его, уже был бы нарушен, создавая причину не добавлять такие специализации в будущем.
Пока я говорю оstd::vector<int>
В качестве конкретного примера я пытаюсь спросить, определены ли типы вstd
когда-либопользовательский тип s. Вторичный вопрос, даже если нет, может бытьstd::tuple<int>
становитсяпользовательский тип когда используется пользователем (это становится скользким: что тогда происходит, если что-то внутриstd
определяетstd::tuple<int>
, а ты частично специализируешьсяhash
заstd::tuple<Ts...>
).
Там в настоящее времяоткрытый дефект по этой проблеме.