Auto return 模板类型和歧义

Auto return type of template and ambiguity

我有一个重载的模板函数:

template<typename T1, typename T2>
auto overMax(T1 a, T2 b)
{
    std::cout << __FUNCSIG__ << std::endl;

    return b < a ? a : b;
}

template<typename RT, typename T1, typename T2>
RT overMax(T1 a, T2 b)
{
    std::cout << __FUNCSIG__ << std::endl;

    return b < a ? a : b;
}

如果我这样称呼它:

auto a = overMax(4, 7.2); // uses first template
auto b = overMax<double>(4, 7.2); // uses second template

一切正常,但是

auto c = overMax<int>(4, 7.2); // error

导致调用不明确。

为什么 int 是这样,还有哪些其他类型?

RT是不可推导的,所以不提供时,只能调用template<typename T1, typename T2> auto overMax(T1 a, T2 b)

当您(部分)提供一个模板参数时,两种方法都可行,

但根据论点,一个人可能是更好的候选人:

  • 对于auto b = overMax<double>(4, 7.2); // uses second template

    overMax<double, int, double>overMax<double, double> 都可行。
    但是 overMax<double, int, double> 是完全匹配
    overMax<double, double> 需要 intdouble 转换。

  • 对于auto c = overMax<int>(4, 7.2); // Ambiguous call

    overMax<int, int, double>overMax<int, double> 都可行。
    但两者都不是更好的匹配或更专业的,所以调用是模棱两可的。