在下面的代码片段中,在函数调用f(1)
中,1
是类型为int
的文本,在第一个函数中void f(double d)
参数类型是double
,第二个函数void f(short int i)
参数类型是short int。
这里1
是int
类型而不是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;
}
因为,正如您的评论所指出的,1
是int
类型的文字。
对于编译器来说,int
到short int
的隐式转换与int
到double
的隐式转换同样有效(参见C++语言标准,§13.3)。
因此,由于编译器无法在double
和short int
重载之间做出决定,因此它会放弃并发出诊断。
请注意,函数参数的大小无关紧要:重要的是类型。
(如果编译器在运行时选择short int
重载(如果调用参数合适),而在其他情况下double
重载,那将很烦人。