为什么编译器不会自动假设看似浮点const值为float

Ari*_*Ari 0 c++ overloading

让我们看看以下函数重载声明

void funA(int);
void funA(float);
Run Code Online (Sandbox Code Playgroud)

然后我们调用这样的函数:

funA(1);          // this will be ok.
Run Code Online (Sandbox Code Playgroud)

然而,

funA(1.333)         // this will not ok..
Run Code Online (Sandbox Code Playgroud)

对于编译器,funA(int)和funA(float)将是不明确的..编译器将1.333值转换为整数(1)..虽然假设它是一个浮点值会更合适..

我正在使用g ++(GCC)4.8.2为什么编译器不会调用funA(float)呢?但是以下工作..

funA(static_cast<float>(1.333))
Run Code Online (Sandbox Code Playgroud)

jua*_*nza 5

文字1.333是一个double,而不是一个float.从转换doubleint被认为是为一样好doublefloat,因此导致不明确的过载错误.要消除歧义,请传递一个浮点数:

funA(1.333f);
Run Code Online (Sandbox Code Playgroud)

如果你想确保用double参数调用调用funA(float),那么你可以从评论中关注@JamesKanze的例子:

void funA( double v ) 
{ 
  return funA( static_cast<float>( v ) );
}
Run Code Online (Sandbox Code Playgroud)

但请注意,a的范围double可能大于a的范围float.

  • 他违反了关于重载的一般规则:如果你为任何整数类型重载(除了可能是`char`),那么同样重载`int`; 如果你为任何浮点类型重载,那么也要重载`double`.由于OP刚刚发现的原因.(你可以添加一个建议,即他将`funA(double v){funA(static_cast <float>(v));}`添加到重载函数集中.) (2认同)