根据定义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,但我想根据标准确认。
答案 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 标准在上述项目中没有多大区别。