Насколько я знаю, нам разрешено (за некоторыми исключениями, которые я не буду здесь упоминать) «расширять» namespace std
полностью специализируясь std
функция шаблона, такая как std::swap
т.е.
namespace std
{
template<>
void swap<Foo>(Foo& lhs, Foo& rhs){...}
}
совершенно верно.
Начиная с C ++ 11, теперь мы можем частично специализировать функции. Я считаю, что тогда мы можем играть в ту же игру и расширить std
через частичную специализацию, например
namespace std
{
template<typename T>
void swap<Foo<T>>(Foo<T>& lhs, Foo<T>& rhs){...}
}
однако я не уверен в этом и не смог найти соответствующий поясняющий раздел в стандарте. Правильно ли приведенный выше код или он ведет к UB?
PS: Как отметил @Columbo в ответе, мы не можем частично специализировать шаблоны функций, даже в C ++ 11/14. По какой-то причине я думал, что это можно сделать, я полагал, что это было по крайней мере предложение.
Вы можете иметь в виду [namespace.std] / 1:
Программа может добавить шаблон специализации для любой стандартной библиотеки
шаблон в пространство именstd
только если декларация зависит от
пользовательский тип и специализация соответствует стандартной библиотеке
требования к оригинальному шаблону и не явно
запрещено181.
181) Любой код библиотеки, который создает экземпляры других шаблонов библиотеки, должен быть подготовлен для адекватной работы с любым предоставленным пользователем
специализация, отвечающая минимальным требованиям стандарта.
Если частичные специализации шаблонов функций когда-либо вводятся, эта цитата также неявно покрывает их (поскольку она не ограничивается явной специализацией).