C++ 嵌套空类

C++ 嵌套空类,c++,C++,我有以下代码 class nest_empty { class empty{}; }; nest\u empty的大小是否为1(在我的实现中,空类的大小为1)?如果是,为什么?nest\u empty可以被视为空类吗 编辑: class nest_empty { class empty{}; empty d; }; nest\u empty的大小仍然是1吗?如果是,为什么?是empty仅位于nest\u empty的命名空间中 更清楚地说,行类nest_empty{}仅定义

我有以下代码

class nest_empty
{
   class empty{};
};
nest\u empty
的大小是否为1(在我的实现中,空类的大小为1)?如果是,为什么?
nest\u empty
可以被视为空类吗

编辑:

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

nest\u empty
的大小仍然是1吗?如果是,为什么?

empty
仅位于
nest\u empty
的命名空间中


更清楚地说,行
类nest_empty{}仅定义
nest\u empty
。它不会声明
中的任何成员为空

它不是强制要求
sizeof(nest\u empty)
为1,但它不会为零

$9.3表示:
类类型的完整对象和成员子对象的大小应为非零。

这是必需的,因为如果创建一个嵌套为空的数组,则每个数组必须具有不同的地址

编辑


最有可能的是,
sizeof(nest\u empty)
将在两个版本中产生相同的结果,但它不是强制要求的。标准唯一说明的是空类的大小将非零

您的第一个版本的
nest\u empty
是一个空类(没有非静态数据成员,也没有非空基),因此如果您的实现中的类大小为1,那么它的大小为1

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

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


不过,我无法告诉您,它是否真的会在您的实现中具有大小为1的功能。询问您的编译器。

我不是100%确定,但我非常确定嵌套类是“静态”的,就像普通类一样。所以你的nest_empty类的大小仍然是1,除非你给它一个empty()的实例;我很想知道答案是什么。@Equirement:在得到答案后更改问题,而没有正确识别已更改的内容是非常令人困惑的。。。我添加了一个编辑分隔符。根据实现的正确性,大小将为非0值。在这种情况下,第二个
nest\u empty
不是空类(它有一个成员-即使该成员的类型是空类)。是的,
nest\u empty
的大小仍然是它的内容加上填充的大小,也就是
empty
加上填充的大小,正如其他海报所指出的,填充的大小将是一些正值。@balancement:这个实现(根据标准)允许有
sizeof(nest\u empty)=sizeof(empty)
。在大多数编译器上,两者都等于
1