模板自动返回类型和歧义

amp*_*ier 20 c++ templates template-argument-deduction c++17 visual-studio-2019

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

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;
}
Run Code Online (Sandbox Code Playgroud)

如果我这样称呼它:

auto a = overMax(4, 7.2); // uses first template
auto b = overMax<double>(4, 7.2); // uses second template
Run Code Online (Sandbox Code Playgroud)

一切都很完美,但是

auto c = overMax<int>(4, 7.2); // error
Run Code Online (Sandbox Code Playgroud)

导致模棱两可的调用。

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

Jar*_*d42 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>是可行的。
    但两者都不是更好的匹配或更专业,所以调用是模棱两可的。