模板专业化与函数重载

Dar*_*tom 9 c++

问题很简单。之间有什么区别:

template <typename T>
T add(T a, T b)
{
    return a + b;
}

template <>
int add<int>(int a, int b)
{
    return a + b; //no reason to specialize, but still...
}
Run Code Online (Sandbox Code Playgroud)

和:

template <typename T>
T add(T a, T b)
{
    return a + b;
}

int add(int a, int b)
{
    return a + b; //no reason to overload, but still...
}
Run Code Online (Sandbox Code Playgroud)

他们似乎是一样的。

use*_*670 3

第一个变体更简单,因为编译器必须收集仅包含单个项目add<int>(int, int)专门化的候选集,然后从其中进行选择。而第二种变体将导致编译器通过收集一组包含两个项目的候选者来执行一些额外的工作 -add<int>(int, int)add(int, int)使用奇特的函数重载排名算法在它们之间进行选择。