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)
哪个模板在代码中排在第一位没有什么区别。
我希望重载解决方案在这里是模棱两可的。T,T1和T2都应推导为int,这使两个模板都与呼叫站点完全匹配。
我无法找到任何解析规则(https://en.cppreference.com/w/cpp/language/overload_resolution)来解释为什么它会选择第一个模板。
我测试了clang++ -std=c++17,以防万一。
当同一功能模板特化匹配多个重载功能模板时(这通常是由模板自变量推导得出的),将对重载功能模板进行部分排序以选择最佳匹配。
具体来说,在以下情况下会发生部分排序:
1)调用函数模板专门化的重载解析
Run Code Online (Sandbox Code Playgroud)template<class X> void f(X a); template<class X> void f(X* a); int* p; f(p);2)...
...
非正式地,“ A比B更专业”表示“ A接受的类型少于B”。
选择第一个重载是因为它只接受一种相同类型的参数,而第二个重载可以接受两种独立类型的参数。
| 归档时间: |
|
| 查看次数: |
98 次 |
| 最近记录: |