函数返回双精度当预期的长

Function returning double when expected long

本文关键字:返回 双精度 函数      更新时间:2023-10-16

我最近回答了另一个问题,在我的回答中我有以下代码:

template<typename T, typename ... Ts>
struct are_arithmetic{
    enum {
        value = std::is_arithmetic<T>::value && are_arithmetic<Ts...>::value
    };
};
template<typename T>
struct are_arithmetic<T>{
    enum {
        value = std::is_arithmetic<T>::value
    };
};
template<typename Arg, typename = std::enable_if_t<std::is_arithmetic<Arg>::value>>
Arg max(Arg arg){
    return arg;
}
template<typename Arg, typename Arg1, typename ... Args, typename = typename std::enable_if_t<are_arithmetic<Arg, Arg1, Args...>::value>>
auto max(Arg arg, Arg1 arg1, Args ... args){
    auto max_rest = max(arg1, args...);
    return arg > max_rest ? arg : max_rest;
}

现在,从这段代码中,我假设max()将返回给定数字列表中的最大数字,并保留其类型。

但是当原始海报尝试代码:

int main(){
    auto res = max(1.0, 2, 3.0f, 5, 7l);
    std::cout << typeid(res).name() << " "  << typeid(7l).name();
}

他从stdout得到d l

这表明函数的返回类型根本不是所期望的。为什么函数不返回long

在我看来,当max()函数称为:

auto res = max(1.0, 2, 3.0f, 5, 7l);

然后给出它的签名:

auto max(Arg arg, Arg1 arg1, Args ... args){
    auto max_rest = max(arg1, args...);
    return arg > max_rest ? arg : max_rest;
}

这里,Arg显然是double

返回值是一个三元操作符:

return 1.0 > max_rest ? 1.0 : max_rest;

max_rest最终是什么并不重要。假设它确实是long。所以你有一个三元运算符,一个double表达式和一个long表达式。

在我看来,long表达式将被类型提升为double,因此返回auto类型是double

的返回类型
template<typename Arg, typename Arg1, typename ... Args, typename = typename std::enable_if_t<are_arithmetic<Arg, Arg1, Args...>::value>>
auto max(Arg arg, Arg1 arg1, Args ... args){
    auto max_rest = max(arg1, args...);
    return arg > max_rest ? arg : max_rest;
}

不依赖于值,而是给定的类型。这里它返回所有参数的通用类型