我正在阅读Stroustrup的书,关于重载和相关含糊不清的部分。
有一个例子如下:
void f1(char);
void f1(long);
void k(int i)
{
f1(i); //ambiguous: f1(char) or f1(long)
}
正如评论所述,电话不明确。 为什么呢?
本书的前一部分根据匹配的形式和实际参数说明了5条规则。因此,关于“促销”,上述函数调用是否应该遵守规则2? 我的猜测是'我'应该提升到很长时间,就是这样。
根据评论,似乎int to char转换(降级?)也属于规则2?
答案 0 :(得分:6)
上面的int中的任何东西都不再是促销活动了。任何小于int到int的东西都是促销(除了极少数情况 - 见下文)
因此,如果您更改为以下内容,则会变得不明确,选择第一个
void f1(int);
void f1(long);
void k(unsigned short i) {
f1(i);
}
请注意,这仅适用于int
可以存储unsigned short
的所有值的平台。在不是这种情况的平台上,这不是促销,而且电话不明确。在此类平台上,类型unsigned int
将成为促销目标。
浮点数会发生同样的事情。将float
转换为double
是促销,但double
至long double
不是促销。在这种情况下,C ++与C不同,其中double
到long double
同样是促销(但是,它无论如何都没有重载)。
答案 1 :(得分:0)
int可以转换为char,int也可以转换为long。
所以从这个意义上来说它是模棱两可的,因为编译器无法判断你正在调用哪个。