0

当我想到这个例子时,我正在回答这个问题:

#include <iostream>

void func(int i);
void func();

int main (){
    func();
    return 0;
}
void func(){}

在上面的例子中,代码编译得很好。但是,在下面的示例中,代码无法正确编译:

#include <iostream>

void func();
int func();

int main (){
    func();
    return 0;
}
void func(){}

这是编译此代码时发生的错误(在 clang++ 中):

file.cpp:4:5: error: functions that differ only in their return type cannot be
  overloaded
int func();

我预计两次都会出现这样的错误。

我稍微摆弄了一下代码,出于某种完全奇怪的原因,链接器似乎完全忽略了不正确的声明。现在这允许一些非常奇怪的代码。例如这个头文件是合法的:

#ifndef EXAMPLE
#define EXAMPLE
void func();
void func(int a);
void func(int b);
void func(int a, int b);
void func(int a, short b);
void func(int w);
void func(short b);
#endif

为什么?为什么在世界上任何一个都有效?这只是 C++ 标准失败吗?编译器故障?“特征”?实际功能?(顺便说一句,这只是一个问题。)

PS 当我在等待答案时,我将在这里利用这一点在代码中预先添加可能最终会投入生产的功能。

4

1 回答 1

1

首先是函数重载,不考虑参数名称(参数类型或其计数不同)。

第二个是函数重新声明(参数类型和计数相同),更改返回类型是被禁止的。不允许仅重载返回类型。编译器告诉你了。

于 2018-03-10T04:40:36.130 回答