POD 类中的嵌套枚举是否使它不是 POD

Does a nested enum inside POD class makes it not POD?

本文关键字:POD 是否 枚举 嵌套      更新时间:2023-10-16

根据这里的定义,POD 是一个简单的类,没有用户定义的构造函数、非静态成员,并且只包含简单的数据类型。

问题是,下面的这两个类是否等同于 POD 类型(就内存占用而言):

class pod
{
public:
   int x;
   double y;
};
class pod1
{
public:
   int x;
   double y;
   enum POD_TYPE
   {
      POD1 = 0,
      POD = 1
   };
};

换句话说,向类中添加枚举是否只影响枚举的作用域解析,而不会影响类本身的属性?通过观察,似乎类仍然是豆荚,但我想根据标准确认。

是的,该类型仍然是 POD。定义由C++11 9/10给出:

POD 结构是一个非联合类,它

既是普通类又是标准布局类,并且没有非 POD 结构、非 POD 联合(或此类类型的数组)类型的非静态数据成员。

琐碎意味着它在创建、销毁或复制对象时不会做任何有趣的事情。标准布局意味着它不会对数据成员的布局做任何有趣的事情:没有多态性,并且限制你可以使用访问说明符和继承做什么。如果您想了解更多细节,这些术语在 C++11 9/6 和 9/7 中完全定义。

嵌套类型(例如枚举)、静态数据成员和非虚拟成员函数(除了构造函数等,这将使它变得不平凡)不会影响任何这些事情,所以它仍然是 POD。

更新:既然你说你对历史定义感兴趣,C++03定义:

9/4 POD 结构是一个聚合类,它没有非 POD 结构、非 POD 联合(或此类类型的数组)类型的非静态成员,并且没有用户定义的复制赋值运算符和用户定义的析构函数"

8.5.1/1 聚合是一个数组或类,没有用户声明的构造函数,没有私有或受保护的非静态数据成员,没有基类,也没有虚函数。

所以有更多的限制;但嵌套类型仍然是允许的。我没有 C++98 的副本,但我相信这与 C++03 相同。

它对 POD 状态没有任何区别,因为定义嵌套enum不会将数据成员添加到类中。实际上,您还可以定义一个嵌套类,该类在pod1不是POD,并且它仍然不会对pod1的PODness产生影响。

枚举

POD_TYPE是一种类型,不会影响布局,我们可以从C++类成员19.2标准部分的草稿中看到这一点:

[...]类的成员包括数据成员、成员函数 (9.3)、嵌套类型和 统计员。数据成员和成员函数是静态或非静态的;请参阅 9.4.嵌套类型是类 (9.1, 9.7) 和枚举 (7.2) [...]

数据成员相反,我们可以进一步看到,标准布局类的定义仅取决于第 16 段中的数据成员,该段落说:

如果两个标准布局结构(条款 9)类型具有相同数量的非静态数据成员,并且相应的非静态数据成员(按声明顺序)具有布局兼容类型 (3.9),则它们与布局兼容

我们进一步看到回到第910段,其中说(强调我的):

POD 结构体108 是一个非联合类,它既是普通类又是标准布局类,并且没有非 POD 结构、非 POD 联合(或此类类型的数组)类型的非静态数据成员。同样,POD 联合是一个联合,它既是普通类又是标准布局类,并且没有非 POD 结构、非 POD 联合(或此类类型的数组)类型的非静态数据成员。POD 类是 POD 结构或 POD 联合的类。

据我所知,C++11 之前的标准在上述项目中没有太大差异。