【问题标题】:C++ overload ambiguity: conversion versus promotion with primitive typesC++ 重载歧义:原始类型的转换与提升
【发布时间】:2015-06-28 16:52:14
【问题描述】:

在这段代码中:

void f(float f, long int i) { cout << "1" << endl; }
void f(float f, float d) { cout << "2" << endl; }

int main() {

   f(5.0f, 5);

}

有歧义。 Check it out!。但是,第二个参数是有符号整数。将int 绑定到long int 参数需要提升,但绑定到float 需要转换。

由于第一个参数是关于两个重载的完全匹配,它不计算在内。但是对于第二个参数,它在第一个超载(提升)的排名优于第二个(转换)的排名。

为什么会出现分辨率模糊,而不是选择第一个重载?

【问题讨论】:

    标签: c++ type-conversion overloading type-promotion


    【解决方案1】:

    5 默认为int 类型。所以你在这两种情况下都有转化:

    • intlong int(又名 long
    • intfloat

    1) longint 不兼容,因为在 certain data models 上,它们的大小可能不同。

    2) intfloat 是定义为“浮点-整数转换”的转换:

    整数或无范围枚举类型可以转换为任何浮点类型的纯右值。如果无法正确表示该值,则选择最接近的较高或最接近的较低可表示值由实现定义。

    【讨论】:

      【解决方案2】:

      intlong 是一种转换。 shortint 是一种促销活动。 (有关完整促销活动的完整列表,请参阅 [conv.prom]。)

      同样,floatdouble 是浮点提升。 doublelong double 是一种转换。

      【讨论】:

        【解决方案3】:

        因为在这两种情况下都没有完全匹配。 5、无限定,有int类型。您的方法将“float”或“long int”声明为参数,并且两者都需要转换。 long != int!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-11-02
          • 2017-02-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多