在 C++ 中交换 class & struct 关键字

Interchanging class & struct keyword in C++

我正在阅读一个名为 Injected class name here 的奇怪 C++ 功能。

我试过遵循简单的程序

#include <iostream>
class test
{
    int s{3};
    public:
    int get_s()
    { return s; }
};
int main() {
    class test::test s;  // struct test::test s; also allowed. Why???
    std::cout<<s.get_s();
}

如果我在 main() 程序的第一行中将 class 关键字替换为 struct 仍然可以正常编译和运行。查看现场演示 here。为什么?我不应该得到编译器错误吗?为什么它编译得很好?

struct 和 class 在 C++ 中几乎相同。唯一的区别是,结构的成员默认是 public 而 classes 的成员默认是私有的。

在此处查看完整答案:C/C++ Struct vs Class

class test s; 要么 struct test s; 也有效。

类 和 C++ 中的结构实际上是一回事。

区别是:

struct A{
};

就像

class A{
public:
};

class B{
};

就像

struct B{
private:
};

允许您使用 struct 前缀是为了 C 兼容性,我猜它扩展到 class 因为 "why not?".

对不起,也许我误解了你的post但是class和C++中的struct没有太大的区别。 我知道的主要区别是默认情况下,结构具有所有字段 public.

有一个 post 讨论 struct 和 class 之间的区别: What are the differences between struct and class in C++?

我相信相关的经文在 7.1.6.3/3 中(突出显示我的,引用自 C++17 标准草案):

Thus, in any elaborated-type-specifier, the enum keyword shall be used to refer to an enumeration (7.2), the union class-key shall be used to refer to a union (Clause 9), and either the class or struct class-key shall be used to refer to a class (Clause 9) declared using the class or struct class-key.

因此,无论哪个关键字用于declare/define test.

,都可以使用任一关键字来规定注入的class名称存在的范围