为了账号安全,请及时绑定邮箱和手机立即绑定

什么是聚合和POD以及它们如何/为何特殊?

什么是聚合和POD以及它们如何/为何特殊?

C++ C
慕村225694 2019-05-27 12:56:44
什么是聚合和POD以及它们如何/为何特殊?此常见问题解答涉及聚合和POD,并涵盖以下材料:什么是聚合?什么是POD(普通旧数据)?它们有什么关系?它们如何以及为何特别?C ++ 11有什么变化?
查看完整描述

3 回答

?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

C ++ 14改变了什么

我们可以参考Draft C ++ 14标准以供参考。

骨料

8.5.1 聚合部分对此进行了介绍,它给出了以下定义:

聚合是一个数组或类(第9条),没有用户提供的构造函数(12.1),没有私有或受保护的非静态数据成员(第11条),没有基类(第10条),没有虚函数(10.3) )。

唯一的变化是现在添加类内成员初始值设定项不会使类成为非聚合。因此,以下来自C ++ 11的示例聚合了具有成员in-pace initializers的类的初始化

struct A{
  int a = 3;
  int b = 3;};

它不是C ++ 11中的聚合,而是C ++ 14中的聚合。N3605中包含此更改:成员初始值设定项和聚合,具有以下摘要:

Bjarne Stroustrup和Richard Smith提出了一个关于聚合初始化和成员初始化器无法协同工作的问题。本文提出通过采用史密斯提出的措辞来解决这个问题,该措辞消除了聚合不能拥有成员初始化者的限制。

POD保持不变

POD(普通旧数据)结构的定义在9 类Classes中介绍,它们说:

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

这与C ++ 11的措辞相同。

C ++的标准布局更改14

正如评论中所指出的,pod依赖于标准布局的定义,并且对于C ++ 14确实有所改变,但这是通过在事实之后应用于C ++ 14的缺陷报告实现的。

有三个DR:

所以标准布局来自这个Pre C ++ 14:

标准布局类是一个类:

  • (7.1)没有非标准布局类(或这类类型的数组)或引用类型的非静态数据成员,

  • (7.2)没有虚函数([class.virtual]),没有虚基类([class.mi]),

  • (7.3)对所有非静态数据成员具有相同的访问控制(Clause [class.access]),

  • (7.4)没有非标准布局基类,

  • (7.5)在大多数派生类中没有非静态数据成员,并且最多只有一个具有非静态数据成员的基类,或者没有具有非静态数据成员的基类,并且

  • (7.6)没有与第一个非静态数据成员相同类型的基类

为了在C ++ 14

类S是标准布局类,如果它:

  • (3.1)没有非标准布局类(或这类类型的数组)或引用的非静态数据成员,

  • (3.2)没有虚函数,也没有虚基类,

  • (3.3)对所有非静态数据成员具有相同的访问控制,

  • (3.4)没有非标准布局基类,

  • (3.5)最多有一个任何给定类型的基类子对象,

  • (3.6)该类中的所有非静态数据成员和位字段及其基类首先在同一个类中声明,并且

  • (3.7)没有集合M(S)类型的元素作为基类,其中对于任何类型X,M(X)定义如下.104 [注意:M(X)是类型的集合在X中可能处于零偏移的所有非基类子对象。 - 结束注释]

    • (3.7.1)如果X是非联合类类型,没有(可能是继承的)非静态数据成员,则集合M(X)为空。

    • (3.7.2)如果X是非联合类类型,其类型为X0的非静态数据成员,其大小为零或者是X的第一个非静态数据成员(其中所述成员可能是匿名联合),集合M(X)由X0和M(X0)的元素组成。

    • (3.7.3)如果X是联合类型,则集合M(X)是所有M(Ui)和包含所有Ui的集合的并集,其中每个Ui是X的第i个非静态数据成员的类型。 。

    • (3.7.4)如果X是元素类型为Xe的数组类型,则集合M(X)由Xe和M(Xe)的元素组成。

    • (3.7.5)如果X是非类非数组类型,则集合M(X)为空。


查看完整回答
反对 回复 2019-05-27
  • 3 回答
  • 0 关注
  • 514 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信