据我了解,标准布局允许三件事:
现在,库中包含的是
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