我正在学习c ++中的模板,并且发现了以下示例。
据我了解,如果没有匹配的非模板函数,编译器应始终尝试使用最“专业化”的模板,但是在此示例中,第一次调用导致调用函数a(T *)而不是a(int) *)。为什么?为何第二通电话的行为有所不同?
template<typename T>
void a(T) {cout << "(T)" << endl;}
template<>
void a<>(int*) {cout << "(int)" << endl;}
template<typename T>
void a(T*) {cout << "(T*)" << endl;}
template<typename T>
void b(T) {cout << "(T)" << endl;}
template<typename T>
void b(T*) {cout << "(T*)" << endl;}
template<>
void b<>(int*) {cout << "(int)" << endl;}
int main()
{
int i;
a(&i);
b(&i);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
结果输出为:
(T*)
(int)
Run Code Online (Sandbox Code Playgroud)
我期望它是:
(int)
(int)
Run Code Online (Sandbox Code Playgroud)