1

我正在阅读 Stroustrup 的书,关于重载和相关歧义的部分。

有一个例子如下:

void f1(char);
void f1(long);

void k(int i)
{
    f1(i);    //ambiguous: f1(char) or f1(long)
}

正如评论所述,这个电话是模棱两可的。为什么?

本书上一节陈述了基于匹配形式参数和实际参数的 5 条规则。那么上述函数调用不应该符合关于“促销”的规则 2 吗?我的猜测是“我”应该被提升为长,就是这样。

根据评论,似乎 int 到 char 的转换(降级?)也符合规则 2?

4

2 回答 2

6

从 int 上面得到的任何东西都不再是促销了。任何小于 int 到 int 的东西都是促销(除了极少数情况 - 见下文)

因此,如果您更改为以下内容,它将变得明确,请选择第一个

void f1(int);
void f1(long);

void k(unsigned short i) {
    f1(i);
}

请注意,这仅在int可以存储unsigned short. 在不是这种情况的平台上,这不会是促销活动,而且电话是模棱两可的。在此类平台上,类型unsigned int将是推广目标。

浮点数也会发生同样的事情。转换floatdouble升职,但double不是long double升职。在这种情况下,C++ 与 C 不同,其中doubletolong double同样是一种提升(但是,它无论如何都没有重载)。

于 2010-06-26T13:18:27.697 回答
0

int 可以转换为 char,int 也可以转换为 long。

所以从这个意义上说,它是模棱两可的,因为编译器无法判断你在调用哪个。

于 2010-06-26T13:18:03.483 回答