【发布时间】:2018-03-10 04:37:03
【问题描述】:
当我想到这个例子时,我正在回答this question:
#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++ 标准失败吗?编译器故障? “特征”?实际功能? (顺便说一句,这是一个问题。)
附:在等待答案的同时,我将在这里利用这一点在代码中预添加可能最终会投入生产的功能。
【问题讨论】:
-
我不明白你在问什么。可以重载参数,但不能重载返回类型。如果您可以重载返回类型,则必须有信息向后流动。使用您提供的示例头文件,您有几个重复的
void func(int)声明,但这不是问题。你有什么问题? -
问题是:为什么编译器允许重复的函数声明?在这种情况下,一种潜在的“用途”是在不同的声明中使用不同的默认参数,但这将是非常值得怀疑的。我不确定为什么编译器会允许重复声明。
-
@Justin 问题是为什么编译器/链接器允许许多声明甚至没有警告。都是一样的功能。
标签: c++ function standards header-files redeclaration