【问题标题】:Explanation of ambiguity in function overloading for this example in C++C++ 中此示例的函数重载中的歧义解释
【发布时间】:2010-06-26 13:13:35
【问题描述】:

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

有一个例子如下:

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

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

正如评论所述,调用是模棱两可的。 为什么?

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

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

【问题讨论】:

    标签: c++ ambiguity overloading


    【解决方案1】:

    上面的任何来自 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 不同,其中 doublelong double 同样是一种提升(但是,它无论如何都没有重载)。

    【讨论】:

    • "请注意,这仅适用于 int 可以存储所有 short 值的平台。在不是这种情况的平台上 [...]" 我认为这样的平台可能不存在,C 标准(第 6.2.5.8 节)规定“对于任何两个具有相同符号和不同整数转换等级的整数类型(参见 6.3.1.1),具有较小整数转换等级的类型的值范围是另一种类型的值。”,并在 §6.3.1.1.1 中说“[...] int [...] 的等级应大于 short int 的等级。”。当然只是挑剔,我赞成你的回答。 :)
    • @Matteo 啊,对,好点——我想用unsigned short。感谢您的支持。我在互联网上显然错了:)
    • +1 以获得关于隐式转换和参数匹配的真正彻底的答案。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多