首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模板重载解析规则

模板重载解析规则
EN

Stack Overflow用户
提问于 2018-01-04 07:21:35
回答 2查看 55关注 0票数 1

只是不明白发生了什么。有人能把这些解释清楚吗?如果是的话,请给我一些线索或关键字来搜索。

代码语言:javascript
复制
template <typename T1, typename T2>
auto max (T1 a, T2 b) {
  std::cout << "1" << std::endl;
  return a > b ? a : b;
}

template <typename RT, typename T1, typename T2>
RT max (T1 a, T2 b) {
  std::cout << "2" << std::endl;
  return a > b ? a : b;
}

void func() {
  auto a = max(4, 7.2); // 1 ? 
  auto b = max<long double>(7.2, 4); // 2 ?
  auto c = max<int>(3.4, 2); // 2 ?
  auto e = max<double, int>(3.4, 2); // 1 ?
}

如果没有定义第二次最大函数,那么每个最大调用都可以正常工作。在什么地方叫第二次最大号。规矩是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-04 07:33:06

max(4, 7.2)从第一个模板生成一个函数,因为两个参数<int, double>是已知的。

max<long double>(7.2, 4)从第二个模板生成一个函数,因为已知有三个参数(long double, double, int)

max<int>(4, 7.2)和以前一样。

max<double, int>(3.4, 2)从第一个模板生成一个函数,因为两个给定的模板参数适合于给定的值。这两个参数是<double, int>

如果没有给出模板参数,编译器将尝试从函数调用中推断类型。

票数 1
EN

Stack Overflow用户

发布于 2018-01-04 13:19:47

如果不指定模板类型,则永远不会使用第二种形式,因为无法推导RT,必须指定RT。

如果您确实指定了一个类型,并且它与从参数中推导出来的T1不同,那么将使用第二种形式。

请注意,第一个表单实际上是C++14,而不是C++11。在C++11中,您必须以某种方式指定返回类型。

第二种形式是C++11,可以在C++14中提供,以实现向后兼容性。原则上,第二个表单允许您控制扩展,但实际上我不确定第二个表单给您带来了什么,因为?:必须解析到单个大小类型。这回答了你的补充质询。

例如,如果这两种类型有符号和无符号,并且返回类型为double (但您会得到警告),则?:结果可能是无符号(或错误),然后强制转换为double,这是没有帮助的。理想情况下,您需要第三个版本来处理签名/无符号不匹配,如果您关心的话-这是一个完整的特殊情况蠕虫来解决干净。

如果它是用2条返回语句长手写的,那么它将正确地扩大两部分的范围。更好的是,如果在比较之前.

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48090504

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档