这是超载吗?

Is this overloading?

如果我有两个这样的函数:

int f ( int a )
{}

void f ( signed a )
{}

他们超载了吗?

当我在 main() 中调用 f(5) 时,出现错误:

old declaration ‘void f(int)’

类型说明符 signedint(单独使用,没有其他类型说明符)定义相同的有符号整数类型。

也就是说你可以等价地写成例如

int a;
signed a;
signed int a;
int signed a;

所以问题中的函数具有相同的参数声明。

但是它们有不同的 return 类型

int f ( int a )
{ }

void f ( signed a)
{}

即同一个函数被不同的return类型重新定义。 return 类型不参与函数重载。

因此编译器发出一个错误,即同一个函数被不同的 return 类型定义了两次。

来自 C++ 14 标准(13.1 可重载声明)

2 Certain function declarations cannot be overloaded:

(2.1) — Function declarations that differ only in the return type cannot be overloaded

如果您要更改其中一个函数中的参数声明,例如按以下方式

int f ( int a )
{ }

void f ( unsigned a)
{}

那么函数将被重载并且这个语句

f( 5 );

将调用第一个重载函数,因为整型文字 5 的类型为 int..