是POD类型完全等同于琐碎的标准布局类型吗?


22

在C ++ 20中,不赞成使用POD的概念,因为它是琐碎且标准的布局的无意义的合成特征。但是,C ++ 20草案中POD的定义并不完全是“琐碎的和标准布局”;实际上是:

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

换句话说,POD类型不仅是琐碎的而且是标准布局的,而且也是递归的。

该递归需求是否多余?换句话说,如果一个类型既是琐碎的又是标准布局,那么它是否也自动递归地变得琐碎又是标准布局?如果答案为“否”,那么标准布局,琐碎类型却无法成为POD的例子是什么?

Answers:


12

在C ++ 20中,不赞成使用POD的概念,因为它是琐碎且标准的布局的无意义的合成特征。

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

POD一词在标准中不再起作用,它仅是定义而已,当其他几种类型保留此残余属性时,将应用限制。

本质上,既是普通布局又是标准布局的类型,除了琐碎和标准布局本身提供的功能之外,没有其他功能。两者的结合并没有使类型变得特殊,并且这两个属性之间确实没有太大关系。

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

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

基本上,人们环顾四周,意识到在C ++中没有什么特别需要琐碎的标准布局交集的。因此,我们不需要为此保留任何条件。在标准明确指出某些类型为“ POD”的那几个地方,可以适当地简单地用“简单且标准的布局”代替。

该递归需求是否多余?

由于两个构成要求都是单独递归的,因此两者的交集也是递归的。因此,没有明确需要声明所有子对象也是POD。这很可能只是复制粘贴异常的一种情况,原始定义中说了诸如“所有非静态数据成员都必须是POD类型”之类的东西,而他们只是保留了该语句。


它关心的只是成员子对象的布局是否以清晰的,标准强制的顺序发生 ”为什么标准必须强制执行一个顺序才能确定成员的偏移量?std的目标是在成员没有补偿的情况下允许疯狂暗示吗?
curiousguy19年

1

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

[class.prop]

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

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

  • ...

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

[class.default.ctor]

如果默认构造函数不是用户提供的,并且满足以下条件:

  • ...
  • 对于其类类型(或其数组)的所有该类非静态数据成员,每个此类都有一个琐碎的析构函数。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.