标准只要求空类的大小不能为零,不过一般编译器都设成1.
C++用不同地址来区别不同对象,如果空类大小为零,就会出现不同对象的地址相同。
A a1, a2;
if (&a1 == &a2) //- 按标准,这个条件不应该成立
还有一个很好记的解释,假如定义了一个数组 A a[10],C++中可以用sizeof(a)/sizeof(A)来求数组大小,如果sizeof(A)=0,这个用法就会出问题。
但是,有一点很奇怪,零数组的大小确实为0,这样看起来不是空类,对象大小却为0!
class B {
char m[0];
};
typedef int C[0];
这时sizeof(B)与sizeof(C)都是0.也许是因为这个缘故,C++标准不允许定义零数组,但是GCC中只给出警告,而不认为是个错误,后果自负。