【问题标题】:How is is_standard_layout useful?is_standard_layout 有什么用?
【发布时间】:2013-04-06 07:56:57
【问题描述】:

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

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

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

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

【问题讨论】:

  • 让代码更健壮没有错。

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


【解决方案1】:

一般反应

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

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

【讨论】:

  • “你不会想编写假定标准布局的代码” 但是什么类型的通用代码假定标准布局?我以前使用过is_podis_trivial,但从未使用过is_standard_layout
猜你喜欢
  • 2021-10-18
  • 1970-01-01
  • 2017-04-10
  • 1970-01-01
  • 1970-01-01
  • 2019-04-26
  • 2016-04-29
  • 2017-03-02
  • 2012-10-04
相关资源
最近更新 更多