模板的自动返回类型和歧义

时间:2020-01-15 13:03:20

标签: c++ templates c++17 visual-studio-2019 template-argument-deduction

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

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 会如此,然后确定还有哪些其他类型?

1 个答案:

答案 0 :(得分:25)

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>都是可行的。
    但是,两者都不是更好的匹配方式,也不是更专业的匹配方式,因此通话内容不明确。