我只是在玩 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() {}
编译就好了。
根据这个答案,data members across access specifiers may be reordered in memory
。因此,没有任何保证实际上必须是实际布置在内存x
中的第一个成员。Foo
我定义的方式Foo
,y
实际上可能是第一个元素,对吗?
我认为标准布局意味着您可以或多或少地了解给定类型的字节是如何布局的。允许以任意方式重新排序标准布局类型中的字段对我来说似乎违反直觉。为什么允许这样做?