【发布时间】:2020-02-28 07:55:08
【问题描述】:
考虑代码:
#include <iostream>
template <typename T>
void f(T)
{
std::cout << "Version 1" << std::endl;
}
template <typename T>
void f(T *)
{
std::cout << "Version 2" << std::endl;
}
template <>
void f<>(int *)
{
std::cout << "Version 3" << std::endl;
}
int main()
{
int *p = nullptr;
f(p);
return 0;
}
此代码将输出Version 3。发生的情况是函数重载规则查看void f 的前两个版本(第三个版本是专门化的,不参与重载),并决定第二个版本是更好的版本。一旦做出决定,我们就会查看第二个版本是否存在任何专业化。有,我们使用它。
那么,我的问题是:编译器如何知道我的显式特化是第二个重载的特化,而不是第一个重载的特化?我没有为它提供模板参数以供它做出选择。决定要专门化哪个函数是否遵循与决定调用哪个重载类似/相同的规则(如果它正在调用该函数)?这有点道理……
【问题讨论】:
标签: c++ overloading template-specialization