模板演绎似乎有误

yua*_*uan 5 c++ templates

推导出的模板似乎是错误的,为什么(c)被调用而不是(b)?

#include <iostream>
using namespace std;
template<class T> void f(T){cout << "f(T)";}//(a)
template<> void f<>(int*){cout << "f(int*)";}//(b)
template<class T> void f(T*){cout << "f(T*)";}//(c)
//void f(int*){cout <<"POD:f(int*)";}//(d)

int main(int argc,char*argv[])
{
    int p = 1;
    f(&p);
    cout <<endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

f(T*)

R. *_*des 3

好吧,让我们先理清我们的情况。

(a) 是一个函数模板。(b) 是该函数模板的特化。(c) 是重载(a) 的另一个函数模板。

当您编写时,f(&p)需要考虑两个重载:两个函数模板(a)和(c)。(c)T*比 (a) 更专业T,因此选择 (c)。

现在让我们考虑注释掉的 (d)。这不是函数模板 (a) 的特化,而是额外的重载。为了解决该f(&p)调用,现在需要考虑三个重载。(d) 不是模板并且与int*的类型匹配&p,因此它会比其他两个模板被选中。