考虑到这段代码:
template <class T>
void f(T p) { //(1)
cout << "Second" << endl;
}
template <>
void f(int *p) { //(2)
cout << "Third" << endl;
}
template <class T>
void f(T* p) { //(3)
cout << "First" << endl;
}
诸如int *p; f(p);
will output之类的调用First
。
如果声明的顺序改变了,像这样:
template <class T>
void f(T* p) { //(3)
cout << "First" << endl;
}
template <class T>
void f(T p) { //(1)
cout << "Second" << endl;
}
template <>
void f(int *p) { //(2)
cout << "Third" << endl;
}
相同的调用 ( int *p; f(p);
) 将输出Third
。
我读到了函数模板重载决议发生的方式:首先,决议只考虑非模板函数和底层基础模板。在选择“最特化”的那个之后,如果它是一个模板函数并且它对推导(或显式指定)的参数具有特化,则调用该特化。
现在我的问题是:如何确定函数是专门针对哪个基础模板?在我的示例中,对于哪个函数模板重载( (1) 或 (3) )是 (2) 特化?
我的猜测是,在声明特化时,会考虑已声明的模板,并从那些最“特化”(其参数与该特化“最接近”的)中选择。这个对吗?另外,您能否指出标准中指定的位置?