据我所知,我们被允许(除了一些我不会在这里提到的例外)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 中也是如此。出于某种原因,我认为可以做到这一点,我相信这至少是一个提议。