【问题标题】:Is being a POD type exactly equivalent to being a trivial, standard-layout type?POD 类型是否完全等同于普通的标准布局类型?
【发布时间】:2020-03-05 10:09:30
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c++ language-lawyer c++20 standard-layout


    【解决方案1】:

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

    不正确。 POD 一词已被弃用,因为 it no longer matters:

    术语 POD 在标准中不再有任何用途,它只是被定义,并且当一些其他类型保留此残留特性时,会应用限制。

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

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

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

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

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

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

    【讨论】:

    • "它所关心的只是成员子对象的布局是否以明确的、标准强制执行的顺序发生" 为什么 std 必须强制执行一个命令才能确定成员的偏移量?允许成员没有偏移量的疯狂 impl 是 std 的目标吗?
    【解决方案2】:

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

    [class.prop]

    一个类 S 是一个标准布局类,如果它:

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

    • ...

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

    [class.default.ctor]

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-30
      • 2020-03-25
      相关资源
      最近更新 更多