在C ++ 20中,不赞成使用POD的概念,因为它是琐碎且标准的布局的无意义的合成特征。
不正确 POD一词已被弃用,因为它不再重要:
POD一词在标准中不再起作用,它仅是定义而已,当其他几种类型保留此残余属性时,将应用限制。
本质上,既是普通布局又是标准布局的类型,除了琐碎和标准布局本身提供的功能之外,没有其他功能。两者的结合并没有使类型变得特殊,并且这两个属性之间确实没有太大关系。
标准布局是关于其非空子对象的布局已明确定义的(以及其空基类子对象不会干扰该类型的布局)。琐碎性是关于对象是否具有超出其存储的位块的含义(以及从概念上讲,如果使用任意位块初始化它是否为有效对象)。
如果我正在制作一个带有type的模板T
,并且想查看我是否可以memcpy
使用该类型的对象,那么我不在乎其成员的布局;我想知道它是否TriviallyCopyable。同样,offsetof
如果类具有用户提供的副本构造函数,则丝毫不会在乎其正确性。它关心的只是成员子对象的布局是否以明确的,标准强制的顺序发生。
基本上,人们环顾四周,意识到在C ++中没有什么特别需要琐碎的标准布局交集的。因此,我们不需要为此保留任何条件。在标准明确指出某些类型为“ POD”的那几个地方,可以适当地简单地用“简单且标准的布局”代替。
该递归需求是否多余?
由于两个构成要求都是单独递归的,因此两者的交集也是递归的。因此,没有明确需要声明所有子对象也是POD。这很可能只是复制粘贴异常的一种情况,原始定义中说了诸如“所有非静态数据成员都必须是POD类型”之类的东西,而他们只是保留了该语句。