只是不明白发生了什么。有人能把这些解释清楚吗?如果是的话,请给我一些线索或关键字来搜索。
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 ?
}如果没有定义第二次最大函数,那么每个最大调用都可以正常工作。在什么地方叫第二次最大号。规矩是什么?
发布于 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>
如果没有给出模板参数,编译器将尝试从函数调用中推断类型。
发布于 2018-01-04 13:19:47
如果不指定模板类型,则永远不会使用第二种形式,因为无法推导RT,必须指定RT。
如果您确实指定了一个类型,并且它与从参数中推导出来的T1不同,那么将使用第二种形式。
请注意,第一个表单实际上是C++14,而不是C++11。在C++11中,您必须以某种方式指定返回类型。
第二种形式是C++11,可以在C++14中提供,以实现向后兼容性。原则上,第二个表单允许您控制扩展,但实际上我不确定第二个表单给您带来了什么,因为?:必须解析到单个大小类型。这回答了你的补充质询。
例如,如果这两种类型有符号和无符号,并且返回类型为double (但您会得到警告),则?:结果可能是无符号(或错误),然后强制转换为double,这是没有帮助的。理想情况下,您需要第三个版本来处理签名/无符号不匹配,如果您关心的话-这是一个完整的特殊情况蠕虫来解决干净。
如果它是用2条返回语句长手写的,那么它将正确地扩大两部分的范围。更好的是,如果在比较之前.
https://stackoverflow.com/questions/48090504
复制相似问题