137 votes

C ++ :: pourquoi y a-t-il un nom de classe injecté?

Récemment, j'ai vu l'étrange fonctionnalité C ++, nom de classe injecté .

 class X { };
X x1;
class X::X x2; // class X::X is equal to X
class X::X::X x3; // ...and so on...
 

Mais je ne peux pas comprendre pourquoi cette fonctionnalité est nécessaire. Existe-t-il une pratique qui nécessite cette fonctionnalité?

Et j'ai entendu dire que cette fonctionnalité n'existait pas dans l'ancien C ++. Alors, quand est-il introduit? C ++ 03? 11?

154voto

Jonathan Wakely Points 45593

L'injection de nom de classe signifie qu' X est déclarée en tant que membre de l' X, de sorte que la recherche d'un nom à l'intérieur d' X trouve toujours de la classe actuelle, pas un autre X qui pourrait être déclaré dans le même cadre englobant, par exemple

void X() { }
class X {
public:
  static X create() { return X(); }
};

Est l' create() de la fonction de la création d'un temporaire X objet ou l'appel de la fonction X? À portée espace de noms, il ferait appel de la fonction, de sorte que le but de l'injection de la classe-nom est de s'assurer que l'intérieur du corps de l' X le nom de la trouve toujours de la classe elle-même (parce que la recherche d'un nom commence dans la classe " propre champ d'application, avant d'examiner dans le cadre englobant).

Il est également utile à l'intérieur de modèles de classe, où l'injection nom de la classe peut être utilisée sans argument de modèle de liste, par exemple en utilisant simplement Foo , au lieu de la totalité du modèle id- Foo<blah, blah, blah>, de sorte qu'il est facile de consulter le courant de l'instanciation. Voir DR 176 pour un changement entre C++98 et C++03, qui a précisé que.

L'idée de la injecté nom de la classe était présent en C++98, mais la terminologie a été nouvelle pour le C++03.

C++98, dit:

Un nom de classe est inséré dans le champ d'application dans lequel elle est déclarée immédiatement après le nom de classe est vu. Le nom de classe est également inséré dans le champ d'application de la classe elle-même.

La deuxième phrase a été modifiée par le DR 147 C++03, dit dans [classe]/2:

Un nom de classe est inséré dans le champ d'application dans lequel elle est déclarée immédiatement après le nom de classe est vu. 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.

Même avant le C++98, le BRAS de a à peu près équivalent expression qui renvoie à la classe' nom peut toujours être utilisé dans le corps de la classe référer à la classe elle-même:

Le nom d'une classe peut être utilisé comme un nom de classe même au sein de la liste-des-membres de la classe spécificateur de lui-même.

  • Par exemple,

    class link { link* next; };

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X