gpt4 book ai didi

c++ - 预期长时函数返回双倍

转载 作者:搜寻专家 更新时间:2023-10-31 01:00:18 27 4
gpt4 key购买 nike

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

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 类型是

关于c++ - 预期长时函数返回双倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31367282/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com