C++重载优先于Specialization?

Bru*_*tos 6 c++ templates overloading template-specialization overload-resolution

给出以下代码:

#include <iostream>

using namespace std;

template<typename T> void Print(T t) {
    cout << t << endl;
}

template<> void Print<int>(int t) {
    cout << "int = " << t << endl;
}

void Print(int i) {
    cout << "int2 = " << i << endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
    Print(1.3);
    Print("tese");
    Print(2);

    char c;

    cin >> c;

return 0;
}
Run Code Online (Sandbox Code Playgroud)

为什么调用Print(2)不是模糊的,而是调用void Print(int i)?

ps:使用bcc64.exe和cl.exe进行测试.

mrk*_*rks 2

这是因为非模板函数是一等公民。有关详细信息,请参阅Herb Sutter 的这篇文章或这篇 SO 帖子

来自赫伯·萨特的文章:

非模板函数是一等公民。将选择与参数类型以及任何函数模板匹配的普通旧式非模板函数,而不是其他同样好的函数模板。

如果没有至少同样好的一等公民可供选择,那么接下来会参考二等公民的功能基本模板。选择哪个函数基模板取决于哪个最匹配并且是“最专业的”(重要提示:奇怪的是,“专业”的这种使用与模板专业化无关;这只是一个不幸的口语)根据一组相当神秘规则: