C++ 重新声明 inconsistency/interestingness

C++ redeclaration inconsistency/interestingness

我在回答的时候想到了这个例子:

#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++ 标准的失败吗?编译失败? "Feature"?实际功能? (顺便说一下,这是一个问题。)

P.S。在等待答案的同时,我将在这里利用它在代码中预添加可能最终会投入生产的功能。

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

第二个是函数重声明(参数类型和计数相同)改变return类型是被禁止的。不允许只重载 return 类型。编译器告诉你的。