Что я могу и не могу специализироваться в пространстве имен std?


пользователи могут добавлять явные специализации к std пространство имен. Однако, есть несколько шаблонов, которые мне запрещены специальности.

какие шаблоны можно и нельзя специализировать?

1 54

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++ не определено, если оно объявляет

  • явная специализация любой функции-члена стандартного шаблона класса библиотеки, или

  • явная специализация любого шаблона функции-члена стандартного класса библиотеки или шаблона класса, или

  • явная или частичная специализация любого шаблона класса-члена стандартного библиотечного класса или шаблона класса.

программа может явное создание экземпляра шаблона, определенного в стандартной библиотеке, только если объявление зависит от имени определяемого пользователем типа, и экземпляр соответствует стандартным требованиям библиотеки для исходного шаблона.