专用模板函数与没有模板关键字的专用模板函数

Specialized template function vs specialized template function without template keyword

代码 1:

template<typename T>
T sum(T t1, T t2)
{
    return t1 + t2;
}

int sum(int a, int b)
{
    return a + b + a;
}

int main()
{
    sum(10,20);
    return 0;
}

代码 2:

template<typename T>
T sum(T t1, T t2)
{
    return t1 + t2;
}

template<>
int sum<int>(int a, int b)
{
    return a + b + a;
}

int main()
{
    sum(10,20);
    return 0;
}

在这两种情况下,专门的求和函数有什么不同吗? 我的编译器为这两种情况提供了相同的输出。 我一直遵循第一种方法。区别仅仅是从第二种方式我们一看就知道是一个专门的函数吗?

第一个是模板特化,第二个是函数重载。它在解析规则中很重要 - 完全匹配的重载将通过专门的模板进行选择。

如果你有函数 sum2:

template<typename T>
T sum2(T t1, T t2)
{
    ...
    return sum<T>(t1, t2);
}

它不会调用重载变体 1,但会从变体 2 调用模板特化。