预期长时函数返回双倍
Function returning double when expected long
我最近回答了另一个问题,在我的回答中有以下代码。
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()
会 return 给定数字列表中的最大数字并保留其类型。
但是当楼主尝试代码时:
int main(){
auto res = max(1.0, 2, 3.0f, 5, 7l);
std::cout << typeid(res).name() << " " << typeid(7l).name();
}
他从 stdout 得到 d l
。
这表明函数的 return 类型根本不是预期的类型。为什么函数不是 return 一个 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值为三元运算符:
return 1.0 > max_rest ? 1.0 : max_rest;
max_rest
结果如何并不重要。假设它确实是 long
。所以你有一个三元运算符,有一个 double
表达式和一个 long
表达式。
在我看来 long
表达式将被类型提升为 double
,因此 return auto
类型是 double
.
return类型
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;
}
不依赖于值,而是依赖于给定的类型。
所以这里 return 是所有参数的通用类型。
我最近回答了另一个问题,在我的回答中有以下代码。
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()
会 return 给定数字列表中的最大数字并保留其类型。
但是当楼主尝试代码时:
int main(){
auto res = max(1.0, 2, 3.0f, 5, 7l);
std::cout << typeid(res).name() << " " << typeid(7l).name();
}
他从 stdout 得到 d l
。
这表明函数的 return 类型根本不是预期的类型。为什么函数不是 return 一个 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值为三元运算符:
return 1.0 > max_rest ? 1.0 : max_rest;
max_rest
结果如何并不重要。假设它确实是 long
。所以你有一个三元运算符,有一个 double
表达式和一个 long
表达式。
在我看来 long
表达式将被类型提升为 double
,因此 return auto
类型是 double
.
return类型
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;
}
不依赖于值,而是依赖于给定的类型。 所以这里 return 是所有参数的通用类型。