расширение пространства имен std посредством частичной специализации шаблона

Насколько я знаю, нам разрешено (за некоторыми исключениями, которые я не буду здесь упоминать) «расширять» 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. По какой-то причине я думал, что это можно сделать, я полагал, что это было по крайней мере предложение.

2

Решение

Вы можете иметь в виду [namespace.std] / 1:

Программа может добавить шаблон специализации для любой стандартной библиотеки
шаблон в пространство имен std только если декларация зависит от
пользовательский тип и специализация соответствует стандартной библиотеке
требования к оригинальному шаблону и не явно
запрещено181.


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

Если частичные специализации шаблонов функций когда-либо вводятся, эта цитата также неявно покрывает их (поскольку она не ограничивается явной специализацией).

4

Другие решения


По вопросам рекламы [email protected]