用struct关键字声明一个类,反之亦然

Arm*_*yan 4 c++ struct class declaration

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

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

struct B; //declaration
class B {...}; //definition
Run Code Online (Sandbox Code Playgroud)

当我想到它时,如果真的允许这样的话,我没有看到任何问题(因为struct和class本质上是相同的).但它(标准)?

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

Bo *_*son 8

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

我相信这个警告是由MSVC使用不同的名称修改结构和类引起的,这会使它更不实用......


应@Armen的要求:

7.1.5.3详细说明的类型说明符,p3

...在任何详细类型说明符中,enum关键字应用于表示枚举(7.2),union 类密钥用于表示联合(第9条),class或者struct 类密钥应使用用于引用使用classor struct class-key声明的类(第9节).


Alo*_*ave 5

根据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;
}
Run Code Online (Sandbox Code Playgroud)

这是输出:

prog.cpp: In function ‘int main()’:
prog.cpp:6: error: ‘int B::j’ is private
prog.cpp:13: error: within this context
Run Code Online (Sandbox Code Playgroud)

C++ struct和class之间的唯一区别是结构的默认访问说明符是公共的,而对于类是私有的.

因此,从上面的例子:
在这种情况下,编译器将其A视为structure&
B作为class

如您所见,编译器遵循标准中的引用,并且具有定义的类型是编译器在声明类型上识别的内容.