当我想到这个例子时,我正在回答这个问题:
#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 当我在等待答案时,我将在这里利用这一点在代码中预先添加可能最终会投入生产的功能。