Bri*_*ian 20 c++ language-lawyer standard-layout c++20
在C ++ 20中,不赞成使用POD的概念,因为它是琐碎且标准的布局的无意义的合成特征。但是,C ++ 20草案中的POD定义并不完全是“琐碎的和标准布局”;实际上是:
POD类是既是普通类又是标准布局类的类,并且不具有非POD类类型的非静态数据成员(或其数组)。POD类型是标量类型,POD类,这种类型的数组或这些类型之一的cv限定版本。
换句话说,POD类型不仅是琐碎的而且是标准布局的,而且也是递归的。
该递归需求是否多余?换句话说,如果一个类型既是琐碎的又是标准布局,那么它是否也自动递归地变得琐碎又是标准布局?如果答案为“否”,那么标准布局,琐碎类型却不能成为POD的例子是什么?
Nic*_*las 10
在C ++ 20中,不赞成使用POD的概念,因为它是琐碎且标准的布局的无意义的合成特征。
不正确 POD一词已被弃用,因为它不再重要:
POD一词在标准中不再起作用,它仅是定义而已,当其他几种类型保留此残留属性时,将应用限制。
本质上,既是普通布局又是标准布局的类型,除了琐碎和标准布局本身提供的功能之外,没有其他功能。两者的结合并没有使类型变得特殊,并且这两个属性之间确实没有太大关系。
标准布局是关于其非空子对象的布局已明确定义的(以及其空基类子对象不会干扰该类型的布局)。琐碎性是关于对象是否具有超出其存储的位块的含义(以及在概念上是否用任意位块初始化的对象是否有效)。
如果我正在制作一个带有type的模板T,并且想查看是否可以memcpy使用该类型的对象,那么我不在乎其成员的布局;我想知道它是否TriviallyCopyable。类似地,offsetof如果类具有用户提供的副本构造函数,则丝毫不关心其正确性。它关心的只是成员子对象的布局是否以清晰的,标准强制的顺序进行。
基本上,人们环顾四周,意识到在C ++中没有什么特别需要琐碎的标准布局交集的。因此,我们不需要为此保留任何期限。在标准明确指出某些类型为“ POD”的那几个地方,可以适当地简单地用“简单且标准的布局”代替。
该递归需求是否多余?
由于两个构成要求都是单独递归的,因此两者的交集也是递归的。因此,没有明确需要声明所有子对象也是POD。这很可能只是复制粘贴异常的一种情况,原始定义中说了诸如“所有非静态数据成员都必须是POD类型”之类的东西,而他们只是保留了该语句。
标准布局取决于非静态成员的标准布局:
[类.prop]
如果满足以下条件,S 类就是标准布局类:
没有非标准布局类(或此类类型的数组)类型的非静态数据成员或引用,
...
琐碎性还取决于非静态成员的琐碎性。为了简洁起见,我只引用了默认构造函数的规则,但其他特殊成员函数也有类似的措辞:
[类.default.ctor]
如果默认构造函数不是用户提供的并且满足以下条件,则它是微不足道的:
- ...
- 对于其类中属于类类型(或其数组)的所有非静态数据成员,每个此类都有一个简单的析构函数。
据我所知,明确要求适用于成员的 PODness 是多余的,因为它也隐含地遵循标准布局和琐碎的要求。