c++ - POD 类型与普通的标准布局类型完全等同吗?

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

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

A POD class is a class that is both a trivial class and a standard-layout class, and has no non-static data members of type non-POD class (or array thereof). A POD type is a scalar type, a POD class, an array of such a type, or a cv-qualified version of one of these types.

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

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

最佳答案

In C++20, the concept of POD is deprecated, supposedly because it is a meaningless composite trait of being trivial and standard-layout.

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

The term POD no longer serves a purpose in the standard, it is merely defined, and restrictions apply for when a few other types preserve this vestigial property.

本质上,既简单又标准布局的类型不会获得除了简单和标准布局本身提供的功能之外的任何功能。两者的组合并不会使该类型变得特别,并且这两个属性彼此之间并没有太大关系。

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

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

基本上,人们环顾四周,意识到 C++ 中已经没有什么特别需要平凡性和标准布局的交集了。所以我们不需要为它保留一个术语。标准明确指出某些类型将是“POD”的少数地方可以根据需要简单地替换为“琐碎且标准的布局”。

Is this recursive requirement redundant?

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

关于c++ - POD 类型与普通的标准布局类型完全等同吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58772267/

相关文章:

c++ - C++中如何让类的成员函数每次调用时生成不同的随机数?

c++ - 在折叠表达式中使用 lambda 时出现 "Uninitialized captured reference"错误 - clang 与 gcc

C++20 NTTP 特化

c++ - 通过引用调用 constexpr 方法 - 结果是常量表达式吗?

C++ 概念 : checking for template instantiation

c++ - C++ 标准中 `restrict` 关键字/属性的情况

c++ - 如何在不丢失现有数据的情况下调整 std::vector 的大小?

c++ - 我如何从不同的类中获取函数来调用在 Main 中声明的对象?

c++ - 变量零初始化 - 是否有未定义的行为

c++ - 协程和带有静态变量的函数有什么区别?