POD 类中的嵌套枚举是否使它不是 POD
Does a nested enum inside POD class makes it not POD?
根据这里的定义,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++类成员第 1 段9.2
标准部分的草稿中看到这一点:
[...]类的成员包括数据成员、成员函数 (9.3)、嵌套类型和 统计员。数据成员和成员函数是静态或非静态的;请参阅 9.4.嵌套类型是类 (9.1, 9.7) 和枚举 (7.2) [...]
与数据成员相反,我们可以进一步看到,标准布局类的定义仅取决于第 16 段中的数据成员,该段落说:
如果两个标准布局结构(条款 9)类型具有相同数量的非静态数据成员,并且相应的非静态数据成员(按声明顺序)具有布局兼容类型 (3.9),则它们与布局兼容
。
我们进一步看到回到第9
类第10段,其中说(强调我的):
POD 结构体108 是一个非联合类,它既是普通类又是标准布局类,并且没有非 POD 结构、非 POD 联合(或此类类型的数组)类型的非静态数据成员。同样,POD 联合是一个联合,它既是普通类又是标准布局类,并且没有非 POD 结构、非 POD 联合(或此类类型的数组)类型的非静态数据成员。POD 类是 POD 结构或 POD 联合的类。
据我所知,C++11 之前的标准在上述项目中没有太大差异。
- 是否可以使用 std::array 作为 POD 结构的数据容器?
- POD类型是否完全等同于琐碎的标准布局类型
- POD 结构(相同类型的成员):成员是否位于连续的内存位置?
- 默认情况下初始化时 POD 是否给予特殊处理 (C++14)?
- POD 类型是否可以具有显式声明的默认移动分配运算符
- 是否可以制作非 POD 类型的流
- 通过指向其基的指针删除 POD 对象是否安全
- 绑定是否接受非POD参数中传递的的值或引用
- POD 类对象初始化是否需要构造函数
- 使用 memcpy 移动非 POD C++对象是否总是调用未定义行为
- POD 类中的嵌套枚举是否使它不是 POD
- 我们是否需要为分配"placement new" "simple POD classes"显式调用析构函数?
- C++:是否有点将常量添加到作为参数传递的 POD 中
- (POD)结构上是否需要移动构造函数
- 如果我将一个POD结构分配给另一个POD组织,是否存在内存泄漏
- 是否存在非POD结构优先于类的有效用例
- C++11:赋值运算符是否阻止一个类型成为POD,从而全局初始化
- 是否可以以这样一种方式实现一个类,即可以将其值初始化为POD
- 从动态创建的数组构造pod对象时,是否推荐使用placement new ?
- 我是否需要使一个类型为POD,以便用内存映射文件持久化它?