22

在 C++20 中,POD 的概念已被弃用,据说是因为它是琐碎和标准布局的无意义复合特征。但是, C++20 草案中对 POD 的定义并不完全是“既琐碎又标准布局”;实际上是:

POD 类是一个既是普通类又是标准布局类的类,并且没有非 POD 类(或其数组)类型的非静态数据成员。POD 类型是标量类型、POD 类、此类类型的数组或这些类型之一的 cv 限定版本。

换句话说,POD 类型不仅是普通布局和标准布局,而且递归也是如此。

这个递归要求是多余的吗?换句话说,如果一个类型既是平凡又是标准布局,那么它是否也会自动递归平凡和标准布局?如果答案是“否”,那么标准布局、普通类型无法成为 POD 的示例是什么?

4

2 回答 2

12

在 C++20 中,POD 的概念已被弃用,据说是因为它是琐碎和标准布局的无意义复合特征。

不正确。POD 一词已被弃用,因为它不再重要

POD 一词在标准中不再有任何用途,它只是被定义,并且当一些其他类型保留这种残留属性时适用限制。

本质上,一个既平凡又标准布局的类型除了平凡和标准布局本身提供的能力外,不会获得任何能力。两者的结合并没有使类型变得特别,而且这两个属性彼此之间并没有太大的关系。

标准布局是关于其非空子对象的布局被明确定义(以及它的空基类子对象不会干扰类型的布局)。琐碎性是关于对象是否具有超出其存储的位块的某些含义(以及如果它是用任意位块初始化的,它在概念上是否是有效的对象)。

如果我正在制作一个采用 type 的模板T,并且我想看看我是否可以memcpy使用该类型的对象,那么我不关心其成员的布局;我想知道它是否是 TriviallyCopyable。同样,如果该类具有用户提供的复制构造函数,那么 的正确性offsetof也毫不在意。它所关心的只是成员子对象的布局是否以清晰的、标准强制的顺序发生。

基本上,人们环顾四周,意识到 C++ 中没有什么特别需要琐碎和标准布局的交集。所以我们不需要为它保留一个期限。标准明确指出某些类型将是“POD”的少数地方可以酌情简单地替换为“琐碎和标准布局”。

这个递归要求是多余的吗?

由于两个组成要求都是单独递归的,因此两者的交集也是递归的。因此没有明确需要声明所有子对象也是 POD。这很可能只是一个复制粘贴奇怪的情况,其中原始定义说“所有非静态数据成员必须是 POD 类型”,他们只是保持该声明不变。

于 2019-11-08T20:16:28.200 回答
2

标准布局取决于非静态成员的标准布局:

[类.prop]

如果满足以下条件,则 S 类是标准布局类:

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

  • ...

琐碎性还取决于非静态成员的琐碎性。为简洁起见,我只引用了默认构造函数的规则,但其他特殊成员函数的措辞类似:

[class.default.ctor]

如果默认构造函数不是用户提供的并且如果:

  • ...
  • 对于其类的所有属于类类型(或其数组)的非静态数据成员,每个这样的类都有一个微不足道的析构函数。

据我所知,PODness 明确要求应用于成员是多余的,因为它也隐含地遵循标准布局和琐碎的要求。

于 2019-11-08T19:23:00.547 回答