【发布时间】: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