C ++重载歧义:使用原始类型进行转换与提升

时间:2015-04-21 13:32:43

标签: c++ type-conversion overloading type-promotion

在此代码中:

void f(float f, long int i) { cout << "1" << endl; }
void f(float f, float d) { cout << "2" << endl; }

int main() {

   f(5.0f, 5);

}

存在歧义。 Check it out!。但是,第二个参数是有符号整数。将int绑定到long int参数需要促销,但需要float转换。

由于第一个参数与两个重载完全匹配,因此不计算。但是关于第二个参数,它在第一个超载(促销)上的排名优于第二个参数(转换)上的排名。

为什么解决方案存在歧义,而不是选择第一次重载?

3 个答案:

答案 0 :(得分:8)

intlong是一种转化。 shortint是促销活动。 (有关整体促销的完整列表,请参阅[conv.prom]。)

同样,floatdouble是浮点促销。 doublelong double是转化。

答案 1 :(得分:1)

5默认为int类型。所以你在两种情况下都有转换:

  • intlong int(又名long
  • intfloat

1) longint不兼容,因为在certain data models上,它们的大小可能会有所不同。

2) intfloat的转化定义为&#34;浮动 - 积分转换&#34;:

  

可以将整数或未范围的枚举类型转换为任何浮点类型的prvalue。如果无法正确表示该值,则实现定义是否将选择最接近的较高或最接近的较低可表示值。

答案 2 :(得分:0)

因为在任何一种情况下都没有完全匹配。 5,没有资格,有类型int。您的方法将“float”或“long int”声明为参数,两者都需要转换。 long!= int!