但我当然不应该想到做这些事情,我知道,但这仍然很有趣:
class A; //declaration
struct A {...}; //definition
struct B; //declaration
class B {...}; //definition
当我考虑它时,如果真的允许这样的话,我没有看到任何问题(因为struct和class本质上是相同的)。但它(标准)?
MSVC接受并编译它,并发出警告。
答案 0 :(得分:8)
根据标准允许这样做,但正如一些编制者所警告的那样,它不是很有用。
我相信这个警告是由MSVC使用不同的名称修改结构和类引起的,这会使它更不实用......
根据@Armen的要求:
7.1.5.3详细说明的类型说明符,p3
...在任何 elaborated-type-specifier 中,
enum
关键字应用于引用枚举(7.2),union
类-key 应用于引用联合(第9条),并且class
或struct
class-key 应用于指代class(第9条),使用class
或struct
class-key 声明。
答案 1 :(得分:5)
根据 C ++ 03标准9.1 - 2
“类定义将类名引入定义它的范围,并在封闭范围内隐藏该名称的任何类,对象,函数或其他声明(3.3)。” < / p>
因此按照标准有效。
使用示例代码:
#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;
}
这是输出:
prog.cpp: In function ‘int main()’:
prog.cpp:6: error: ‘int B::j’ is private
prog.cpp:13: error: within this context
C ++ struct&amp; amp; class是结构的默认访问说明符是public,而class是私有的。
所以,从上面的例子来看:
在这种情况下,编译器会将A
视为structure
&amp;
B
class
如您所见,编译器遵循标准中的引用,并且具有定义的类型是编译器在声明类型上识别的内容。