【问题标题】:Promotion of parameters during overloading重载时参数的提升
【发布时间】:2018-02-19 09:53:43
【问题描述】:

我正在研究超载,我完全对促销感到困惑。我查看了 SO (implicit conversion sequence in function overloading) 中的几篇文章,我确信还有一些文章可用,但找不到合适的文章。我还指的是http://www.dcs.bbk.ac.uk/~roger/cpp/week20.htm。 我在看 Stroustrup 的 C++ Programming special edition 并遇到以下解释。

从一组重载函数中找到要调用的正确版本 通过寻找参数类型之间的最佳匹配来完成 表达式和函数的参数(形式参数)。到 近似我们关于什么是合理的概念,一系列标准 依次尝试:1 精确匹配 [2] 使用促销匹配; [3] 使用标准转换匹配 [4] 使用用户定义匹配 转换 [5] 使用省略号匹配......

void print(int);
void print(double);
void print(long);
void print(char);
void h(char c, int i, short s, float f)
{
    print(s); // integral promotion: invoke print(int)
    print(f); // float to double promotion: print(double)
}

我写了下面的代码。我在想,如果我调用值为 1 的函数,则会调用 func1(long) 因为提升发生。但我收到错误消息“错误:重载 'func1(int)' 的调用不明确”。即使是 unsigned char 类型的变量,它也不会调用函数。

此外,如果我通过调用 func1(3.4f),则会调用 func1(double),并按照我的预期进行升级。为什么 1 不提升为 long int 但为什么 float 提升为 double?有哪些整数促销活动?

    void func1(unsigned char speed)
    {
        cout<<"Func1 with unsigned char: speed =" << speed <<" RPM\n";
    }

   void func1(long speed)
    {
        cout<<"Func1 with long Int: speed =" << speed <<" RPM\n";
    }

    void func1(double speed)
    {
        cout<<"Func1 with double: speed =" << speed <<" RPM\n";
    }

    int main(void)
    {
        func1(1);
        func1(3.4f);
        return(0);
    }

【问题讨论】:

    标签: c++ function overloading ambiguity


    【解决方案1】:

    标准规定:

    [C++11: 4.13/1]:("整数转换等级")

    每个整数类型都有一个整数转换等级,定义如下:

    • [..]
    • long long int的等级大于long int的等级大于int的等级,大​​于大于short int 的秩,应大于signed char 的秩。
    • 任何无符号整数类型的等级都应等于对应的有符号整数类型的等级。
    • [..]

    在您的示例中需要模棱两可。

    至于func1(3.4f);,它只是从float到double的提升,这是最好的匹配,因为其他两个重载方法有longunsigned char

    也可以查看table:

    子条款指定的地方:

    [conv.fpprom]:(7.7浮点提升)

    • float 类型的纯右值可以转换为double 类型的纯右值。值不变。
    • 这种转换称为浮点提升。

    【讨论】:

    • 谢谢@StoryTeller!嗯,是的,但是双倍不是更好的匹配吗?
    • @StoryTeller 感谢您帮助我改进我的答案。我更新了,现在怎么样了?
    • 这意味着在整数类型的情况下,不会发生任何提升,我们需要为每个整数类型重载函数?另外,如果我有 func1(char) 和 func1(unsigned char) 如何查看是否调用了 func1(unsigned char) 函数?可能我需要传递一个 ASCII 值大于 127 的字符,这可能无法通过键盘传递!
    • 你总是可以转换参数@Rajesh。
    猜你喜欢
    • 2015-03-30
    • 1970-01-01
    • 1970-01-01
    • 2013-06-25
    • 1970-01-01
    • 2011-01-24
    • 2020-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多