2

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

4

1 回答 1

4

您可能的意思是 [namespace.std]/1:

只有当声明依赖于用户定义的类型并且特化满足原始模板的标准库要求并且没有明确禁止181时,程序才可以将任何标准库模板的模板特化添加到命名空间std


181)任何实例化其他库模板的库代码必须准备好与满足标准最低要求的任何用户提供的专业化充分合作。

如果曾经介绍过函数模板的部分特化,则此引用也将隐含地涵盖它们(因为它不限制自己显式特化)。

于 2015-01-21T22:04:05.023 回答