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