Der injizierte Klassenname bedeutet, dass er X
als Mitglied von deklariert ist X
, sodass bei der Namenssuche im Inneren X
immer die aktuelle Klasse gefunden wird, nicht eine andere X
, die möglicherweise im selben umschließenden Bereich deklariert wird, z
void X() { }
class X {
public:
static X create() { return X(); }
};
Erstellt die create()
Funktion ein temporäres X
Objekt oder ruft sie die Funktion auf X
? Im Namespace-Bereich würde es die Funktion aufrufen. Der Zweck des injizierten Klassennamens besteht also darin, sicherzustellen, dass innerhalb des Hauptteils des X
Namens immer die Klasse selbst gefunden wird (da die Namenssuche im eigenen Bereich der Klasse beginnt, bevor sie in das Gehäuse schaut Umfang).
Dies ist auch in Klassenvorlagen hilfreich, in denen der Name der injizierten Klasse ohne eine Liste mit Vorlagenargumenten verwendet werden kann, z. B. einfach Foo
anstelle der vollständigen Vorlagen-ID Foo<blah, blah, blah>
, sodass Sie leicht auf die aktuelle Instanziierung verweisen können. Siehe DR 176 für eine Änderung zwischen C ++ 98 und C ++ 03, die dies verdeutlichte.
Die Idee des injizierten Klassennamens war in C ++ 98 vorhanden, aber die Terminologie war neu für C ++ 03.
C ++ 98 sagt:
Ein Klassenname wird in den Bereich eingefügt, in dem er unmittelbar nach dem Anzeigen des Klassennamens deklariert wird. Der Klassenname wird auch in den Bereich der Klasse selbst eingefügt.
Der zweite Satz wurde von DR 147 geändert, so dass C ++ 03 in [Klasse] / 2 sagt:
Ein Klassenname wird in den Bereich eingefügt, in dem er unmittelbar nach dem Anzeigen des Klassennamens deklariert wird. Der Klassenname wird auch in den Bereich der Klasse selbst eingefügt. Dies ist als Name der injizierten Klasse bekannt .
Noch vor C ++ 98 hat der ARM einen ungefähr äquivalenten Wortlaut, was bedeutet, dass der Klassenname immer im Klassenkörper verwendet werden kann, um auf die Klasse selbst zu verweisen:
Der Name einer Klasse kann als verwendet werden class-name auch innerhalb der Mitgliedsliste der Klasse specifier selbst.
- Beispielsweise,
class link { link* next; };