is_standard_layout如何有用?

时间:2013-04-13 23:58:51

标签: c++ c++11 standard-layout

据我所知,标准布局允许三件事:

  • 空基类优化
  • 使用某些指针强制转换向后兼容C
  • 使用offsetof

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

is_standard_layout如何有用?没有它会有什么不可能的东西,因此需要它在标准库中吗?

1 个答案:

答案 0 :(得分:4)

一般回复

这是一种验证假设的方法。如果不是这种情况,您不希望编写采用标准布局的代码。

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本质上是一个标准布局的子集。

我感觉他们添加了所有可以想象的类型评估变体,无论任何明显的价值,以防万一有人在下一个标准出来之前可能遇到需求。我怀疑在这些“额外”类型属性上堆积是否会给编译器开发人员带来额外的负担。

这里有一个很好的标准布局讨论:Why is C++11's POD "standard layout" definition the way it is? cppreference.com上还有很多很好的细节:Non-static data members