在超载期间提升参数

时间:2017-09-11 08:05:32

标签: c++ function overloading ambiguity

我正在研究超载,我对促销活动感到困惑。我在SO(implicit conversion sequence in function overloading)中查看了一些文章,我相信还有更多文章可用,但找不到合适的文章。我还指的是http://www.dcs.bbk.ac.uk/~roger/cpp/week20.htm。 我正在看Stroustrup的C ++编程特别版,并且遇到了以下解释。

  

从一组重载函数中查找要调用的正确版本   通过寻找参数类型之间的最佳匹配来完成   表达式和函数的参数(形式参数)。至   接近我们关于什么是合理的概念,一系列标准   按顺序尝试: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)'是暧昧的#34;它甚至不使用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);
    }

1 个答案:

答案 0 :(得分:1)

标准规定:

  

[C++11: 4.13/1]:(&#34;整数转换排名&#34;)

     

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

     
      
  • [..]
  •   
  • long long int的排名应大于排名long int 应大于int ,应大于short int的等级,该等级应大于签名字符的等级。
  •   
  • 任何无符号整数类型的等级应等于相应的有符号整数类型的等级。
  •   
  • [..]
  •   

在你的例子中要求含糊不清。

至于func1(3.4f);,它只是从浮动到双倍的促销,这是最佳匹配,因为其他两个重载方法都有long和{{1 }}

同时检查此table

enter image description here

其中一个子条款指定:

  

unsigned char(7.7浮点促销)

     
      
  • 类型[conv.fpprom]:的prvalue可以转换为float类型的prvalue。价值没有变化。
  •   
  • 此转换称为浮点促销。
  •