通过部分模板特化扩展名称空间std

时间:2015-01-21 21:55:33

标签: c++ templates c++11 language-lawyer explicit-specialization

据我所知,我们可以通过完全专门化namespace std模板功能(例如{{1})来“扩展”std,我们可以(在此处我不会提及) ,即

std::swap

完全有效。

从C ++ 11开始,我们现在可以部分地专门化函数了。我相信我们可以玩同一个游戏并通过部分特化扩展namespace std { template<> void swap<Foo>(Foo& lhs, Foo& rhs){...} } ,比如

std

但是我不确定这一点,并且无法在标准中找到正确的解释部分。代码是否在上面正确或是否导致UB?

PS:正如@Columbo在答案中提到的,我们不能部分专门化功能模板,即使在C ++ 11/14中也是如此。出于某种原因,我认为可以做到这一点,我认为这至少是一个提案。

1 个答案:

答案 0 :(得分:4)

你可能是指[namespace.std] / 1:

  

程序可以为任何标准库添加模板特化   模板到命名空间std 仅当声明取决于a   用户定义的类型和专业化符合标准库   原始模板的要求并未明确说明   禁止 181


     

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

如果引入了函数模板的部分特化,那么这个引用也会隐含地覆盖它们(因为它不会将自己限制在显式特化上)。