は、私はちょうど++グラムで遊んでた、と私は複数の公開アクセス指定子を持つクラスがなぜ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
、y
を定義した方法は、実際には最初の要素でしょうか?
標準のレイアウトでは、指定されたタイプに対してバイトがどのようにレイアウトされているかを多かれ少なかれ理解できると思っていました。標準的なレイアウトタイプのフィールドを任意の方法で並べ替えることは、私には直観的ではないようです。これはなぜ許可されていますか?
'Foo'は標準レイアウトではないかもしれません。' Foo'は標準レイアウトではありません。コンパイラの異なるバージョンが静的アサートに失敗することを選択してもよい。しかし、それがコンパイルされていれば、標準レイアウトでなければならないことが分かります。 –