2016-12-07 6 views
0

Je voulais juste jouer avec g ++, et je trouve quePourquoi une classe avec plusieurs spécificateurs d'accès public 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() {} 

Compile très bien.

Selon this réponse, data members across access specifiers may be reordered in memory. Donc, il n'y a aucune garantie que x doit être le premier membre de Foo lorsqu'il est réellement mis en mémoire. La façon dont j'ai défini Foo, y pourrait effectivement être le premier élément à droite?

Je pensais que la disposition standard signifiait que vous pourriez plus ou moins comprendre comment les octets sont disposés pour le type donné. Autoriser des champs dans un type de mise en page standard à être réorganisé de manière arbitraire semble contre-intuitif pour moi. Pourquoi est-ce autorisé?

+0

'Foo' peut ne pas être la mise en page standard ne signifie pas' Foo' _ ne doit pas être la disposition standard. c'est-à-dire qu'une version différente du compilateur peut choisir d'échouer sur l'assertion statique. Mais si cela compile, vous savez qu'il doit s'agir d'une mise en page standard. –

Répondre

3

Tous les membres de votre structure ont le même spécificateur d'accès: public. Le fait que le mot-clé apparaisse avant chaque membre du cours est sans importance. Ceci est équivalent à l'apparition du spécificateur d'accès public, avant tous les membres du cours.

+0

Alors, la réponse est-elle liée? Parce que cette réponse suggère que le fait d'avoir un spécificateur d'accès 'public' apparaissant plus d'une fois a une certaine différence sémantique – math4tots

+0

Par" answer I linked "je veux dire celui-ci: http://stackoverflow.com/questions/11362543/using-same-c -access-specifiers-mulitple-times/11364029 # 11364029 – math4tots

+0

@ math4tots Il me semble que la réponse est fausse. du projet n3797 9.2 p13: * Les membres de données non statiques d'une classe (non union) avec le même contrôle d'accès (article 11) sont alloués pour que les membres ultérieurs aient des adresses plus élevées dans un objet de classe * Ainsi, privé, protégé et public aucun ordre les uns aux autres tous les objets d'un type ont et l'ordre absolu l'un à l'autre. – NathanOliver