这是文章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)意味着什么?
答案 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*)
扣除类型后。