在显式专业化中的函数名称后的空尖括号

时间:2019-06-26 11:24:03

标签: c++ templates template-specialization

这是文章Why not specialize function templates?

中的代码
template<class T>
void f(T);                     // (1)
template<class T>
void f(T*);                   // (2)
template<>
void f<>(int*);             // (3)

我的问题是关于最后的声明。该语法是什么意思?当我们想要完全专业化功能模板时,例如(1),对于某些类型,我们通常会这样写:

template<>
void f<int>(int);

即我们将该类型放在函数名称后面的尖括号中。

那么语法(3)意味着什么?

2 个答案:

答案 0 :(得分:6)

就您而言,

template<> void f<>(int*);

的显式专业化
template<class T> void f(T*); 

基本模板。与

相同
template<> void f<int>(int*);

只是推导出模板参数。


您甚至可以写:

template<> void f(int*);

具有相同的效果。 cppreference上也有类似的情况,请参见功能模板的显式专业化,其中写有:

  

当专门化函数模板时,如果模板参数推导可以从函数参数中提供它们,则可以省略其模板参数。

C ++标准的相关部分:http://eel.is/c++draft/temp.expl.spec#11

答案 1 :(得分:2)

如果您不提供缺少的模板参数,则编译器将推导出它。在此特定情况下,由于第二个模板更加专业化(但都是候选),因此将推论为int*。所以

template<> void f<>(int*)

将成为

template<> void f<int>(int*)

扣除类型后。