为什么 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++中,structs(和classes)可以直接引用,不需要使用struct关键字。这引入了您所关心的歧义,但另一种选择是像上面那样的有效 C 代码将不是有效的 C++ 代码,这更糟糕。