据我了解,标准布局允许三件事:
- 空基类优化
- 通过某些指针转换向后兼容 C
- 偏移量的使用
现在,库中包含is_standard_layout
谓词元函数,但我看不出它在泛型代码中有多少用处,因为我上面列出的那些 C 功能似乎极少需要检查泛型代码。我唯一能想到的就是在里面使用它static_assert
,但这只是为了让代码更健壮,并不是必需的。
有is_standard_layout
什么用?没有它,是否有任何事情是不可能的,因此在标准库中需要它?
据我了解,标准布局允许三件事:
现在,库中包含is_standard_layout
谓词元函数,但我看不出它在泛型代码中有多少用处,因为我上面列出的那些 C 功能似乎极少需要检查泛型代码。我唯一能想到的就是在里面使用它static_assert
,但这只是为了让代码更健壮,并不是必需的。
有is_standard_layout
什么用?没有它,是否有任何事情是不可能的,因此在标准库中需要它?
这是一种验证假设的方法。如果不是这种情况,您将不想编写假定标准布局的代码。
C++11 提供了一堆这样的实用程序。它们对于编写通用代码(模板)特别有价值,否则您必须相信客户端代码不会犯任何错误。
is_standard_layout
在我看来,(伪代码)定义is_pod
大致是......
// note: applied recursively to all members
bool is_pod(T) { return is_standard_layout(T) && is_trivial(T); }
因此,您需要了解is_standard_layout
才能实施is_pod
. 鉴于此,我们不妨将其公开is_standard_layout
为库开发人员可用的工具。另请注意:如果您有 的用例is_pod
,您可能需要考虑在这种is_standard_layout
情况下实际上可能是更好(更准确)的选择的可能性,因为 POD 本质上是标准布局的子集。
我觉得他们添加了所有可能的类型评估变体,不管有什么明显的价值,以防万一有人在下一个标准出现之前的某个时候遇到需求。我怀疑这些“额外”类型属性是否会给编译器开发人员增加显着的额外负担。
这里有一个关于标准布局的很好的讨论:为什么 C++11 的 POD “标准布局”定义是这样的? cppreference.com 上也有很多很好的细节:非静态数据成员