C++ 这个班有多少人,为什么?

C++ 这个班有多少人,为什么?,c++,class,sizeof,C++,Class,Sizeof,我有两门课,如下所示 class A { }; class B { int a[]; }; int main() { cout << sizeof(A) <<endl; //outputs 1 cout << sizeof(B) <<endl; //outputs 0 return 0; } A类 { }; B类 { INTA[]; }; int main() { CUT< P>你的代码

我有两门课,如下所示

class A
{

};

class B
{
    int a[];
};


int main()
{
    cout << sizeof(A) <<endl;      //outputs 1
    cout << sizeof(B) <<endl;      //outputs 0
    return 0;
}
A类
{
};
B类
{
INTA[];
};
int main()
{

CUT< P>你的代码在C++语言方面是不正确的,特别是,类<代码> B/COD>不应该编译在C++标准一致编译器中。编译器有bug,或者它提供了这个特性作为扩展。 带有
-pedantic错误-std=c++11
的GCC给出了以下错误:

cpp.cpp:18:11: error: ISO C++ forbids zero-size array 'a' [-Wpedantic]
     int a[];
           ^

GCC允许零长度数组作为扩展:

以及:

作为零长度数组原始实现的一个怪癖,sizeof的计算结果为零


<>空类的大小不是1,在C++系统中,它是<强>至少< /强> 1。 原因是,例如,您需要能够使用
new
分配一个实例,并使一个非空指针指向该实例

第二种情况是简单的无效C++。


通常,编译器制造商通过默认允许非标准的“扩展”来获得一些自由,并试图让您无意识地使用它们(偏执狂会说,通过使您的代码不可移植到其他编译器来锁定您)。

B
不应编译。§8.3.4.1如果常量表达式(5.19)是存在的,它应该是一个整型常量表达式,并且它的值应该大于零。@push你在使用哪个编译器,哪个版本?而且,
cout
不是你自己写的东西,是吗?我的意思是,我看不到使用std名称空间的证据…@thomas:请用
-std=c++11-迂腐错误编译它s
,然后让我们知道。我在VS2010中编译了它,它给出了1,1,这可以解释
sizeof(B::a)
为0。我不认为这是
sizeof(B)
为0的借口。我想你必须向gcc开发人员提出这一点。OP没有对结果撒谎。