Je me penche sur la nouvelle définition assouplie de la POD en C++11 (section 9.7)
Une classe de mise en page standard est une classe qui :
- n'a pas de membres de données non statiques de type classe de présentation non standard (ou tableau de tels types) ou référence,
- n'a pas de fonctions virtuelles (10.3) ni de classes de base virtuelles (10.1),
- a le même contrôle d'accès (article 11) pour tous les membres de données non statiques,
- n'a pas de classes de base de mise en page non standard,
- soit n'a pas de membres de données non statiques dans la classe la plus dérivée et au plus une classe de base avec des membres de données non statiques ou n'a pas de classes de base avec des membres de données non statiques, et
- n'a pas de classes de base du type même type que le premier élément de données non statique .
J'ai souligné les éléments qui m'ont surpris.
Que se passerait-il si nous tolérions que les membres des données soient soumis à des contrôles d'accès variables ?
Que se passerait-il si le premier membre des données était également une classe de base ?
struct Foo {};
struct Good : Foo {int x; Foo y;};
struct Bad : Foo {Foo y; int x;};
Je reconnais qu'il s'agit d'une construction bizarre, mais pourquoi devrait-on Bad
être interdites, mais pas Good
?
Enfin, que se passerait-il si plus d'une classe constitutive avait des membres de données ?
0 votes
struct
a toujours eu tous ses membrespublic
. C++11 est maintenant privé ?0 votes
@Mu : Oui, par défaut, les membres d'une structure sont publics. Les membres d'une classe sont privés par défaut, inversement.
15 votes
@Code Il a toujours été possible d'avoir
private
dans unstruct
en C++ (mais pas en C). La valeur par défaut estpublic
Cependant, il ne s'agit pas d'une simple question d'argent, mais bien d'une question de sécurité.1 votes
@Code Monkey : Il a toujours été légal de définir des membres protégés et privés dans une structure - la différence n'était que la valeur par défaut.