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