Ответ 1
Отклонение от стандарта:
-
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, если оно объявляет
явная специализация любой функции-члена стандартного шаблона класса библиотеки или
явная специализация любого шаблона функции-члена стандартного класса библиотеки или шаблона класса или
явная или частичная специализация любого шаблона класса элемента стандартного класса библиотеки или шаблона класса.
Программа может явно создавать шаблон, определенный в стандартной библиотеке, только если декларация зависит от имени определяемого пользователем типа и экземпляра соответствует стандартным требованиям библиотеки для исходного шаблона.