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é?
'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. –