13

据我了解,标准布局允许三件事:

  • 空基类优化
  • 通过某些指针转换向后兼容 C
  • 偏移量的使用

现在,库中包含is_standard_layout谓词元函数,但我看不出它在泛型代码中有多少用处,因为我上面列出的那些 C 功能似乎极少需要检查泛型代码。我唯一能想到的就是在里面使用它static_assert,但这只是为了让代码更健壮,并不是必需的。

is_standard_layout什么用?没有它,是否有任何事情是不可能的,因此在标准库中需要它?

4

1 回答 1

5

一般反应

这是一种验证假设的方法。如果不是这种情况,您将不想编写假定标准布局的代码。

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 上也有很多很好的细节:非静态数据成员

于 2013-04-14T00:56:45.483 回答