2016-12-07 8 views
0

は、私はちょうど++グラムで遊んでた、と私は複数の公開アクセス指定子を持つクラスがなぜ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である必要はありません。私がFooyを定義した方法は、実際には最初の要素でしょうか?

標準のレイアウトでは、指定されたタイプに対してバイトがどのようにレイアウトされているかを多かれ少なかれ理解できると思っていました。標準的なレイアウトタイプのフィールドを任意の方法で並べ替えることは、私には直観的ではないようです。これはなぜ許可されていますか?

+0

'Foo'は標準レイアウトではないかもしれません。' Foo'は標準レイアウトではありません。コンパイラの異なるバージョンが静的アサートに失敗することを選択してもよい。しかし、それがコンパイルされていれば、標準レイアウトでなければならないことが分かります。 –

答えて

3

構造のすべてのメンバーに同じアクセス指定子:publicがあります。すべてのクラスメンバーの前にキーワードが表示されるという事実は重要ではありません。これは、すべてのクラスメンバの前に一度現れるpublicアクセス指定子に相当します。

+0

私は正しくリンクされていないのですか?その答えは、 'public'アクセス指定子を複数回出現させることに意味の違いがあることを示唆しているからです。 – math4tots

+0

" answer I linked "とは、これを意味します:http://stackoverflow.com/questions/11362543/using-same-c -access-specifiers-mulitple-times/11364029#11364029 – math4tots

+0

@ math4totsそれは答えが間違っているように私に見えます。ドラフトn3797 9.2 p13:*同じアクセス制御(11節)を持つ(非ユニオン)クラスの非スタティックデータメンバーは、後のメンバーがクラスオブジェクト内でより高いアドレスを持つように割り当てられます*したがって、 1つのタイプのすべてのオブジェクトがお互いに秩序を持たず、お互いに絶対的な順序があります。 – NathanOliver

関連する問題