Dam*_*saK 13 c++ templates overload-resolution
考虑以下代码:
#include <iostream>
//Number1
template<typename T1, typename T2>
auto max (T1 a, T2 b)
{
std::cout << "auto max(T1 a, T2 b)" <<std::endl;
return b < a ? a : b;
}
//Number2
template<typename RT, typename T1, typename T2>
RT max (T1 a, T2 b)
{
std::cout << "RT max(T1 a, T2 b)" << std::endl;
return b < a ? a : b;
}
int main()
{
auto a = ::max(4, 7.2); //Select Number1
auto b = ::max<double>(4, 7.4); //Select Number2
auto c = ::max<int>(7, 4.); //Compile-time error overload ambiguous
auto c = ::max<double>(7, 4.); //Select Number2
}
Run Code Online (Sandbox Code Playgroud)
auto c = ::max<int>(7, 4.); :此行由于过载含糊而无法编译,并显示以下消息:
maxdefault4.cpp:9:27: error: call of overloaded 'max(int, double)' is ambiguous
auto c = ::max<int>(7, 4.);
^
maxdefault4.cpp:9:27: note: candidates are:
In file included from maxdefault4.cpp:1:0:
maxdefault4.hpp:4:6: note: auto max(T1, T2) [with T1 = int; T2 = double]
auto max (T1 a, T2 b)
^
maxdefault4.hpp:11:4: note: RT max(T1, T2) [with RT = int; T1 = int; T2 = double]
RT max (T1 a, T2 b)
^
Run Code Online (Sandbox Code Playgroud)
而下面的代码:
àuto c = ::max<double>(7, 4.)成功,为什么我们没有相同的错误消息,说明以失败max<double>的方式相同,所以调用是不正确的max<int>?
为什么double没有问题呢?
我在《 C ++模板,完成指南》一书中读过,模板参数推导没有考虑返回类型,所以为什么max<int>模棱两可而不是max<double>?
模板函数的返回类型在参数cutcution中是否真的没有考虑到吗?
son*_*yao 15
模板参数推导未考虑返回类型,
是。模板参数推导是基于函数参数执行的。
那么为什么
max<int>模棱两可max<double>呢?
给定::max<int>(7, 4.),对于第一个重载,将第一个模板参数T1指定为int,并从第二个函数参数T2推导得出,则实例化为。对于第二过载,所述第一模板参数被指定为,推导出作为从,推导出作为从,则实例将是。重载解析也不考虑返回类型,这两个重载都是完全匹配,然后是不明确的。double4.double max(int, double)RTintT1int7T2double4.int max(int, double)
鉴于::max<double>(7, 4.),为第1过载,第一模板参数T1指定为double,并T2推导为double从4.,所以实例会double max(double, double)。对于第二过载,所述第一模板参数RT被指定为double,T1推导出作为int从7,T2推导出作为double从4.,则实例将是double max(int, double)。然后在第二个过载胜重载决议,因为它是一个精确匹配,第一个要求隐式转换从int到double的第一个参数7。