2

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

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

class pod
{
public:
   int x;
   double y;
};

class pod1
{
public:
   int x;
   double y;

   enum POD_TYPE
   {
      POD1 = 0,
      POD = 1
   };
};

换句话说,将枚举添加到类中只会影响枚举的范围解析,而不影响类本身的属性吗?通过观察,似乎 class 仍然是 pod,但我想根据标准来确认。

4

3 回答 3

3

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

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

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

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

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

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

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

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

于 2013-10-25T12:52:11.240 回答
2

它对 POD 状态没有任何区别,因为定义嵌套enum不会将数据成员添加到类中。事实上,你也可以在里面定义一个不是POD的嵌套类,pod1它仍然不会对pod1.

于 2013-10-25T12:45:34.263 回答
1

enum POD_TYPE是一种类型,不会影响布局,我们可以从草案 C++ 标准部分9.2 Class members1段中看到这一点:

[...]类的成员是数据成员、成员函数 (9.3)、嵌套类型和枚举器。数据成员和成员函数是静态的或非静态的;见 9.4。嵌套类型是类 (9.1, 9.7) 和枚举 (7.2) [...]

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

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

我们进一步看到回到第10节的9 Classes部分,它说(强调我的):

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

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

于 2013-10-25T13:22:49.203 回答