嵌套的空类

时间:2010-11-23 13:25:25

标签: c++

我有以下代码

class nest_empty
{
   class empty{};
};

nest_empty的大小是否为1(在我的实现sizof空类是1)?如果是,为什么? nest_empty可以被视为空类吗?

修改

class nest_empty
{
   class empty{};
   empty d;
};

nest_empty的大小是否仍为1?如果是,为什么?

3 个答案:

答案 0 :(得分:6)

您的第一个nest_empty版本是一个空类(没有非静态数据成员,也没有非空基础),因此如果它们在实现中的大小为1,则其大小为1。

“为什么”是因为空类的实现大小为1,而这又是因为它们的大小不能为0(标准禁止它),而您的实现者选择了1。

你的第二个nest_empty不是一个空类(它有一个非静态数据成员)。它可以合法地具有大小1,因为它唯一的非静态数据成员d是类型empty,这是一个空类,因此可能是大小为1。

但是我不能告诉你它实际上是否会在你的实现上有1号。问你的编译器。

答案 1 :(得分:3)

是。 empty位于nest_empty

的命名空间中

为了更清楚,行class nest_empty{};只是定义nest_empty。它没有在empty中声明任何成员。

答案 2 :(得分:3)

sizeof(nest_empty)并非强制要求为1,但它不会为零。

$ 9.3说:Complete objects and member subobjects of class type shall have nonzero size.

这是必需的,因为如果您创建一个nest_empty数组,则每个数组必须具有与另一个不同的地址。

修改

最有可能的是,sizeof(nest_empty)会在两个版本中产生相同的结果,但并非强制要求。标准所说的唯一的事情就是空类的大小会非零。