在此代码中:
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
转换。
由于第一个参数与两个重载完全匹配,因此不计算。但是关于第二个参数,它在第一个超载(促销)上的排名优于第二个参数(转换)上的排名。
为什么解决方案存在歧义,而不是选择第一次重载?
答案 0 :(得分:8)
int
到long
是一种转化。 short
到int
是促销活动。 (有关整体促销的完整列表,请参阅[conv.prom]。)
同样,float
到double
是浮点促销。 double
到long double
是转化。
答案 1 :(得分:1)
5
默认为int
类型。所以你在两种情况下都有转换:
int
至long int
(又名long
)int
至float
1) long
与int
不兼容,因为在certain data models上,它们的大小可能会有所不同。
2) int
到float
的转化定义为&#34;浮动 - 积分转换&#34;:
可以将整数或未范围的枚举类型转换为任何浮点类型的prvalue。如果无法正确表示该值,则实现定义是否将选择最接近的较高或最接近的较低可表示值。
答案 2 :(得分:0)
因为在任何一种情况下都没有完全匹配。 5,没有资格,有类型int。您的方法将“float”或“long int”声明为参数,两者都需要转换。 long!= int!