C ++中本例中函数重载的歧义解释

时间:2010-06-26 13:13:35

标签: c++ ambiguity overloading

我正在阅读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?

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是促销,但doublelong double不是促销。在这种情况下,C ++与C不同,其中doublelong double同样是促销(但是,它无论如何都没有重载)。

答案 1 :(得分:0)

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

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