Cette définition
struct A {
struct B;
};
Définit une structure (struct) A
avec une déclaration de imbriquée struct B
1. Le nom complet de l' B
est A::B
, vous pouvez dire B
est à l'intérieur de l' "espace de noms" de A
. Puis ceci:
struct A::B : A { // Note I added spaces
};
Est la définition de l' A::B
, et le single :
indique qu'il est dérivé à partir d' A
.
Maintenant, la partie la plus intéressante est A::B::A::B
. Nous allons disséquer:
-
A::B
noms de la structure imbriquée.
-
A::B::A
accède à la injecté nom de la classe A
à l'intérieur d' B
. L'injection est en raison de l'héritage.
-
A::B::A::B
noms de la structure imbriquée B
en A
de nouveau.
Et vous pouvez continuer ad vitam aeternam, ou au moins jusqu'à ce que votre compilateur rencontre sa traduction limite de2.
Un amusant exercice intellectuel, mais évitez comme la peste dans le code réel.
[classe.qual]/1 explique comment la recherche fonctionne
Si la nested-nom-spécificateur d'un personnel qualifié-id désigne une classe, l'
le nom spécifié après la nested-nom-spécificateur est recherché dans le
la portée de la classe ([classe.membre.recherche]), sauf pour les cas
énumérés ci-dessous. Le nom doit représenter un ou plusieurs membres de cette
de la classe ou de l'une de ses classes de base (Clause [classe.dérivés]).
Et le texte ci-dessus nous permet de le nom de la classe de base, parce que [la classe]/2
Le nom de classe est également inséré dans le champ d'application de la classe elle-même;
ceci est connu comme la injecté de nom de classe. Pour les fins de l'accès
vérifier la injecté de nom de classe est traité comme s'il s'agissait d'un public
nom de membre.
Le ci-dessus indique clairement que, à partir d'un nom qualifié complet avec A::
vous permet de spécifier un membre ou d'une classe de base. Depuis A
n'a pas de bases, vous pouvez uniquement spécifier A::B
(un "type de membre"). Mais A::B
désigne aussi une classe. Donc on peut spécifier une base ou d'un membre de que aussi bien avec A::B::
, ce qui nous permet de nommer A::B::A
. Maintenant, rincer et répéter.
1 - Notez qu'il s'agit d'une tout autre B
. Pas du tout liées à l'global struct B
.
2 - Un minimum de 256 selon [implimits]/2.36