为什么浮点数和int的std :: pow会调用这个重载?

时间:2017-03-22 17:43:58

标签: c++ c++14 overload-resolution

以下内容:

#include <cmath>

int main()
{
    float base = 2.0f;
    float result = std::pow(base, 2);
    return 0;
}

如果已开启,则会触发-Wconversion警告。 Wandbox

似乎调用double的{​​{1}}重载,我希望选择std::pow重载(将float指数强制转换为{{ 1}})。有人知道他的超负荷,请解释原因吗?

2 个答案:

答案 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
  • 否则&gt;&gt; double

答案 1 :(得分:0)

来自cpp reference

  

7)所有组合的一组重载或函数模板   算术类型的参数不包括在1-3)之内。如果有任何论据   积分型,它是双重的。如果任何参数长两倍,   那么返回类型Promoted也是long double,否则就是了   返回类型总是加倍。

“如果任何参数具有整数类型,则将其转换为double” 然后它会调用,将你的double转换为float。

float       pow( float base, float exp );