Пользователям разрешено добавлять явные специализации в пространство имен std
. Однако есть несколько шаблонов, которые я категорически запретил специализироваться.
Какие шаблоны можно и не могу специализировать?
Пользователям разрешено добавлять явные специализации в пространство имен std
. Однако есть несколько шаблонов, которые я категорически запретил специализироваться.
Какие шаблоны можно и не могу специализировать?
Отклонение от стандарта:
numeric_limits
не должны быть специализированы для неарифметических стандартных типов (например, complex<T>
)
"[S] pecializations shared_ptr
должен быть CopyConstructible, CopyAssignable и LessThanComparable [и] конвертируемым в bool
."
"Специализации weak_ptr
должны быть CopyConstructible и CopyAssignable."
"[T] специализация шаблона [of std::hash
] должна отвечать требованиям хэш-шаблона шаблона.
Все в <type_traits>
: "Поведение программы, которая добавляет специализации для любого из шаблонов классов, определенных в этом подпункте, - это undefined, если не указано иное". (допускаются только некоторые специализации common_type
)
Локали имеют определенные требуемые специализации.
Все специализации istreambuf_iterator
должны иметь тривиальный конструктор копии, конструктор по умолчанию constexpr и тривиальный деструктор.
"Эффект создания экземпляра класса шаблона complex
для любого типа, кроме float, double или long double, не указан". Я полагаю, это означает, что определение таких других специализаций бессмысленно.
"Специализации и экземпляры шаблона atomic
должны иметь конструктор удаленной копии, оператор назначения удаленной копии и конструктор значения constexpr."
"Шаблоны классов unary_function
и binary_function
устарели. Программа не должна объявлять специализации этих шаблонов.
И, конечно, всеобъемлющий пункт 17.6.4.2.1, предложение 1 (спасибо @sehe и @curiousguy):
Поведение программы на С++ undefined, если оно добавляет объявления или определения к пространству имен std или к пространство имен в пространстве имен std, если не указано иное. Программа может добавить специализацию шаблона для любого стандартного шаблона библиотеки для пространства имен std, только если объявление зависит от пользовательского типа и специализация соответствует стандартным требованиям библиотеки для исходного шаблона и не является явно запрещено.
И предложение 2:
Поведение программы на С++ undefined, если оно объявляет
явная специализация любой функции-члена стандартного шаблона класса библиотеки или
явная специализация любого шаблона функции-члена стандартного класса библиотеки или шаблона класса или
явная или частичная специализация любого шаблона класса элемента стандартного класса библиотеки или шаблона класса.
Программа может явно создавать шаблон, определенный в стандартной библиотеке, только если декларация зависит от имени определяемого пользователем типа и экземпляра соответствует стандартным требованиям библиотеки для исходного шаблона.