下面有一些非常基本的 C++ 函数模板重载解析示例(从实际代码中最小化)
struct S {
S() {}
S(int) {}
};
template <typename T = S>
void foo(T x) { std::cout << "S" << std::endl; }
template <>
void foo<S>(S x) { std::cout << "S spc" << std::endl; }
int main() {
foo({});
foo(0);
}
这里我们有两个案例。在第一种情况下,编译器应默认初始化某些东西(例如 S),在第二种情况下将 int 转换为某些东西(例如 S)
我相信在这两种情况下,专业化都会赢得重载,因为专业化完全匹配并且实际上比通过部分排序的主模板更专业 [temp.deduct.partial]
但是这个例子中的 clang 11 和 gcc 10.2 都同意在第二种情况下主模板获胜。这是两个编译器中的错误还是(可能)我不了解 C++ 标准?