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

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

  • 现在,库中包含的是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本质上是标准布局的子集。

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

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

    10-06 10:33