以下内容:
#include <cmath>
int main()
{
float base = 2.0f;
float result = std::pow(base, 2);
return 0;
}
如果已开启,则会触发-Wconversion
警告。 Wandbox
似乎调用double
的{{1}}重载,我希望选择std::pow
重载(将float
指数强制转换为{{ 1}})。有人知道他的超负荷,请解释原因吗?
答案 0 :(得分:4)
从C ++ 11开始,混合参数pow
有任何积分参数强制转换为double。混合参数函数的返回类型始终为double
,除非一个参数为long double
,结果为long double
。
[c.math]
除了数学函数的双重版本之外,C ++还添加了这些函数的float和long double重载版本,具有相同的语义。
此外,还应有足够的额外过载来确保:
如果对应于double参数的任何参数的类型为long double,则对应于double参数的所有参数都有效地转换为long double。
否则,如果对应于double参数的任何参数具有double类型或整数类型,则对应double参数的所有参数都将有效地转换为double。
否则,所有与double参数对应的参数都会被有效地转换为float。
总结一下:
long double
&gt;&gt; long double
float
&gt;&gt; float
double
答案 1 :(得分:0)
来自cpp reference
7)所有组合的一组重载或函数模板 算术类型的参数不包括在1-3)之内。如果有任何论据 积分型,它是双重的。如果任何参数长两倍, 那么返回类型Promoted也是long double,否则就是了 返回类型总是加倍。
“如果任何参数具有整数类型,则将其转换为double” 然后它会调用,将你的double转换为float。
float pow( float base, float exp );