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