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

Rao*_*Rao 1 c++ overloading ambiguity

我正在阅读Stroustrup的书,关于重载和相关含糊不清的部分.

有一个例子如下:

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

void k(int i)
{
    f1(i);    //ambiguous: f1(char) or f1(long)
}
Run Code Online (Sandbox Code Playgroud)

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

本书的前一部分根据匹配的形式和实际参数说明了5条规则.因此,关于"促销",上述函数调用是否应该遵守规则2?我的猜测是'我'应该提升到很长一段时间,就是这样.

根据评论,似乎int to char转换(降级?)也属于规则2?

Joh*_*itb 6

来自上面的任何东西都不再是促销活动.任何小于int到int的东西都是促销(少数情况除外 - 见下文)

因此,如果您更改为以下内容,则选择第一个变为非模糊

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

void k(unsigned short i) {
    f1(i);
}
Run Code Online (Sandbox Code Playgroud)

请注意,这仅适用于int可以存储所有值的平台unsigned short.在不是这种情况的平台上,这不是促销,而且电话不明确.在这样的平台上,类型unsigned int将是促销目标.

浮点数会发生同样的事情.转换floatdouble正在促销,但是doublelong double是不是推广.在这种情况下,C++不同于C,其中doublelong double同样是促进(然而,它不具有反正超载).