is_standard_layout有什么用途?

13
据我所知,标准布局允许三种情况:
  • 空基类优化
  • 与 C 兼容的某些指针转换
  • 使用 offsetof
现在,库中包含is_standard_layout谓词元函数,但我无法看到它在通用代码中有多少用处,因为我列出的那些 C 特性似乎非常罕见,不需要在通用代码中检查。 我唯一能想到的是在static_assert内部使用它,但那只是为了使代码更健壮,而非必需的。
is_standard_layout有什么用处? 有哪些事情是没有它就不可能实现的,因此需要将其纳入标准库中?

让代码更加健壮没有任何问题。 - Brent Bradburn
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_pod,您需要了解is_standard_layout。鉴于此,我们不妨将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

1
你不会想写基于标准布局的代码。但什么类型的通用代码会假设标准布局呢?我以前使用过is_podis_trivial,但从未使用过is_standard_layout - Pubby

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接