模板过载解析:当多个模板匹配时会发生什么?

ppm*_*ppm 7 c++ templates overload-resolution

打印以下程序T,T

#include <iostream>

template<typename T>
void f(T x, T y) {
  std::cout << "T,T\n";
}

template<typename T1, typename T2> 
void f(T1 x, T2 y) {
  std::cout << "T1,T2\n";
}

int main() {
  f(1, 1); 
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

哪个模板在代码中排在第一位没有什么区别。

我希望重载解决方案在这里是模棱两可的。TT1T2都应推导为int,这使两个模板都与呼叫站点完全匹配。

我无法找到任何解析规则(https://en.cppreference.com/w/cpp/language/overload_resolution)来解释为什么它会选择第一个模板。

我测试了clang++ -std=c++17,以防万一。

son*_*yao 5

执行重载功能模板的部分排序,以确定应该选择哪个模板

当同一功能模板特化匹配多个重载功能模板时(这通常是由模板自变量推导得出的),将对重载功能模板进行部分排序以选择最佳匹配。

具体来说,在以下情况下会发生部分排序:

1)调用函数模板专门化的重载解析

template<class X> void f(X a);
template<class X> void f(X* a);
int* p;
f(p);
Run Code Online (Sandbox Code Playgroud)

2)...

...

非正式地,“ A比B更专业”表示“ A接受的类型少于B”。

选择第一个重载是因为它只接受一种相同类型的参数,而第二个重载可以接受两种独立类型的参数。