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