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

时间:2013-10-25 12:33:57

标签: c++ enums nested

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

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

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

class pod1
{
public:
   int x;
   double y;

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

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

3 个答案:

答案 0 :(得分:3)

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

  

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

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

嵌套类型(例如你的枚举),静态数据成员和非虚拟成员函数(除了构造函数等会使它变得非常重要)不会影响任何这些东西,因此它仍然是POD。< / p>

更新:由于您说您对历史定义感兴趣,因此定义了C ++ 03:

  

9/4 POD-struct是一个聚合类,它没有非POD-struct类型的非静态成员,非POD-union(或此类型的数组),并且没有用户定义的副本分配运算符,没有用户定义的析构函数“

     

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

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

答案 1 :(得分:2)

它与POD状态没有任何区别,因为定义嵌套的enum不会将数据成员添加到类中。实际上,您还可以在pod1内定义一个 POD的嵌套类,但它对于pod1的POD仍然没有区别。

答案 2 :(得分:1)

枚举 POD_TYPE类型并且不会影响布局,我们可以从draft C++ standard部分9.2 类成员 1 ,其中说:

  

[...]类的成员是数据成员,成员函数(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联合的类。

据我所知, pre C ++ 11 标准在上述项目中没有多大区别。