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

百万分之几

打印以下程序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;
}

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

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

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

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

songyuanyao

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

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

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

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

template<class X> void f(X a);
template<class X> void f(X* a);
int* p;
f(p);

2)...

...

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在日期字段上执行匹配查询时会发生什么

来自分类Dev

当我使用多个模拟时间时会发生什么?

来自分类Dev

当Java中有多个main方法时会发生什么?

来自分类Dev

当我使用多个模拟时间时会发生什么?

来自分类Dev

暂停时会发生什么?

来自分类Dev

未指定dbCreate时会发生什么?

来自分类Dev

升级Ubuntu时会发生什么?

来自分类Dev

单击提交按钮时会发生什么

来自分类Dev

循环结束时会发生什么?

来自分类Dev

合成子类的变量时会发生什么?

来自分类Dev

达到墓碑限制时会发生什么

来自分类Dev

VRAM已满时会发生什么?

来自分类Dev

当指针太大时会发生什么?

来自分类Dev

断言检查失败时会发生什么?

来自分类Dev

定义函数时会发生什么?

来自分类Dev

升级Ubuntu时会发生什么?

来自分类Dev

达到墓碑限制时会发生什么

来自分类Dev

PHP cookie过期时会发生什么?

来自分类Dev

碳粉过多时会发生什么?

来自分类Dev

验证分离的签名时会发生什么?

来自分类Dev

在/上安装分区时会发生什么?

来自分类Dev

当您用尽PID时会发生什么?

来自分类Dev

时间结束时会发生什么?

来自分类Dev

在/上安装分区时会发生什么?

来自分类Dev

当TransactionScope超时时会发生什么

来自分类Dev

当NSTimer启动时会发生什么

来自分类Dev

当 AsyncTasks 满时会发生什么?

来自分类Dev

更改集合中的对象以使其相互匹配时会发生什么?

来自分类Dev

当有多个emacs初始化文件时会发生什么?