Расширение пространства имен 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. По какой-то причине я думал, что это можно сделать, я полагал, что это было по крайней мере предложение.

1 ответ

Решение

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

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


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

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

Другие вопросы по тегам