我只是用G ++打過來,我發現爲什麼有多個公共訪問說明符standard_layout的類?
#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' _must not_不是標準佈局。即不同版本的編譯器可能選擇在靜態斷言上失敗。但如果它編譯,你就知道它必須是標準佈局。 –