【发布时间】:2016-12-07 03:48:11
【问题描述】:
我只是在玩 g++,我发现了
#include <type_traits>
class Foo {
public: int x;
public: char y;
public: double z;
};
static_assert(std::is_standard_layout<Foo>::value, "Foo is not standard layout");
int main() {}
编译得很好。
根据this 的回答,data members across access specifiers may be reordered in memory。所以没有保证x 必须是Foo 的第一个成员,当实际布置在内存中时。我定义Foo、y 的方式实际上可能是第一个元素,对吧?
我认为标准布局意味着您可以或多或少地了解给定类型的字节是如何布局的。允许以任意方式重新排序标准布局类型中的字段对我来说似乎违反直觉。为什么允许这样做?
【问题讨论】:
-
Foo可能不是标准布局并不意味着Foo不得是标准布局。即不同版本的编译器可能会选择在静态断言上失败。但如果它编译,你知道它必须是标准布局。
标签: c++ standard-layout