C++ 使用struct关键字声明类,反之亦然

C++ 使用struct关键字声明类,反之亦然,c++,class,struct,declaration,C++,Class,Struct,Declaration,但我知道,我们当然不应该想做这样的事情,但这仍然很有趣: class A; //declaration struct A {...}; //definition struct B; //declaration class B {...}; //definition 仔细想想,如果真的允许这样做,我看不出有任何问题(因为struct和class本质上是同一件事)。但这是(标准明智的)吗 MSVC接受并编译它,并发出警告。根据C++03标准9.1-2 类定义将类名引入定义它的作用域,并在封闭作用

但我知道,我们当然不应该想做这样的事情,但这仍然很有趣:

class A; //declaration
struct A {...}; //definition

struct B; //declaration
class B {...}; //definition
仔细想想,如果真的允许这样做,我看不出有任何问题(因为struct和class本质上是同一件事)。但这是(标准明智的)吗

MSVC接受并编译它,并发出警告。

根据C++03标准9.1-2

类定义将类名引入定义它的作用域,并在封闭作用域(3.3)中隐藏该名称的任何类、对象、函数或其他声明

因此,根据标准,它是有效的

对示例代码进行一些讨论:

#include<iostream>

class A; //declaration 
struct A { int i;}; //definition  
struct B; //declaration 
class B {int j;}; //definition 

int main()
{
    A obj;
    obj.i = 10;
    B obj2;
    obj2.j = 10;
    std::cout<<"sizeof"<<sizeof(struct B);
    return 0;
}
<> P>结构与C++类之间的唯一区别是,结构的默认访问说明符是公共的,而类的默认访问说明符是私有的。 因此,从上面的例子来看:
在这种情况下,编译器将
A
视为
结构
&
B
作为


如您所见,编译器遵循标准中的引用,并且定义的类型是编译器识别的类型,而不是声明类型

根据标准,它是允许的,但正如一些编译器警告的那样,它不是很有用

我相信这个警告是由MSVC对结构和类使用了不同的名称而引起的,这会使它变得更不有用


应@Armen的请求:

7.1.5.3详细的类型规范,p3

。。。在任何详细的类型说明符中,
enum
关键字应用于引用枚举(7.2),
union
类键应用于引用联合(第9条),而
class
struct
类键应用于引用类(第9条),使用
class
struct
类键声明


@Als:这段话如何暗示我写的是允许的?oO@ArmenTsirunyan:如果定义在封闭范围中隐藏了该名称的任何声明,那么您编写的内容不应该按照标准引用进行解析吗?@Als:我认为
struct A
class A{…}
都引用了相同的实体,没有名称隐藏。。。还是我遗漏了什么?@Armen Tsirunyan:我正在评估引用,是否存在定义
struct A{…}隐藏声明
A类。这里没有隐藏的地方。。。在上面的代码中完全定义
class A
struct A
,看看会发生什么。标准中的任何引用都允许吗?@Armen-添加了一个引用,完全隐藏在第7章中。:-)
prog.cpp: In function ‘int main()’:
prog.cpp:6: error: ‘int B::j’ is private
prog.cpp:13: error: within this context