为什么函数重载会在C++中产生不明确的错误?

Why does function overloading generate an ambiguous error in C++?

本文关键字:不明确 错误 重载 函数 C++ 为什么      更新时间:2023-10-16

在下面的代码片段中,在函数调用f(1)中,1是类型为int的文本,在第一个函数中void f(double d)参数类型是double,第二个函数void f(short int i)参数类型是short int

这里1int类型而不是double类型,那么为什么编译器会产生歧义错误?

#include <iostream>
using namespace std;
void f(double d)  // First function
{
cout<<d<<endl;
}
void f(short int i) // Second function
{
cout<<i<<endl;
}
int main()
{
f(1); // 1 is a literal of type int
return 0;
}

因为,正如您的评论所指出的,1int类型的文字。

对于编译器来说,intshort int的隐式转换与intdouble的隐式转换同样有效(参见C++语言标准,§13.3)。

因此,由于编译器无法在doubleshort int重载之间做出决定,因此它会放弃并发出诊断。

请注意,函数参数的大小无关紧要:重要的是类型。

(如果编译器在运行时选择short int重载(如果调用参数合适),而在其他情况下double重载,那将很烦人。