Подтвердить что ты не робот

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

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

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

4b9b3361

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

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

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

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

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