我正在研究超载,我对促销活动感到困惑。我在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);
}
答案 0 :(得分:1)
标准规定:
[C++11: 4.13/1]:
(&#34;整数转换排名&#34;)每个整数类型都有一个整数转换等级,定义如下:
- [..]
long long int
的排名应大于排名long int
,应大于int
,应大于short int
的等级,该等级应大于签名字符的等级。- 任何无符号整数类型的等级应等于相应的有符号整数类型的等级。
- [..]
在你的例子中要求含糊不清。
至于func1(3.4f);
,它只是从浮动到双倍的促销,这是最佳匹配,因为其他两个重载方法都有long
和{{1 }}
同时检查此table:
其中一个子条款指定:
unsigned char
(7.7浮点促销)
- 类型
[conv.fpprom]:
的prvalue可以转换为float
类型的prvalue。价值没有变化。- 此转换称为浮点促销。