为什么 C++ 允许一个函数和一个 class 同名?
Why does C++ allow a function and a class have a same name?
#include <iostream>
using namespace std;
struct A
{
A()
{
cout << "A::A()" << endl;
}
};
int A()
{
cout << "void A()" << endl;
return 0;
}
int main()
{
auto v = A();
}
输出为:
void A()
为什么C++允许一个函数和一个class同名?
为什么?因为语言 就是这样! A::A()
函数属于与 A()
不同的 "domain"。
它类似于名称空间,相同的名称可以存在于多个域中。
这也有点类似于拥有一千个不同的函数(或作用域),它们都有自己的循环计数器,称为 i
。
我认为这归结为与 C 的向后兼容性。
在 C 中,当您像以前那样声明一个 struct
时,您必须将其引用为 struct A
,而不仅仅是 A
。例如:
void A() {}
struct A {};
void f()
{
A();
struct A x; // works fine
A y; // does not compile
}
在这种情况下,允许 A
表示两种不同的意思是有意义的,因为根据您是否使用 struct
总是很清楚您指的是哪一种。
在C++中,struct
s(和class
es)可以直接引用,不需要使用struct
关键字。这引入了您所关心的歧义,但另一种选择是像上面那样的有效 C 代码将不是有效的 C++ 代码,这更糟糕。
#include <iostream>
using namespace std;
struct A
{
A()
{
cout << "A::A()" << endl;
}
};
int A()
{
cout << "void A()" << endl;
return 0;
}
int main()
{
auto v = A();
}
输出为:
void A()
为什么C++允许一个函数和一个class同名?
为什么?因为语言 就是这样! A::A()
函数属于与 A()
不同的 "domain"。
它类似于名称空间,相同的名称可以存在于多个域中。
这也有点类似于拥有一千个不同的函数(或作用域),它们都有自己的循环计数器,称为 i
。
我认为这归结为与 C 的向后兼容性。
在 C 中,当您像以前那样声明一个 struct
时,您必须将其引用为 struct A
,而不仅仅是 A
。例如:
void A() {}
struct A {};
void f()
{
A();
struct A x; // works fine
A y; // does not compile
}
在这种情况下,允许 A
表示两种不同的意思是有意义的,因为根据您是否使用 struct
总是很清楚您指的是哪一种。
在C++中,struct
s(和class
es)可以直接引用,不需要使用struct
关键字。这引入了您所关心的歧义,但另一种选择是像上面那样的有效 C 代码将不是有效的 C++ 代码,这更糟糕。