Kürzlich habe ich eine seltsame C ++ - Funktion gesehen: injizierter Klassenname .
class X { };
X x1;
class X::X x2; // class X::X is equal to X
class X::X::X x3; // ...and so on...
Aber ich kann nicht herausfinden, warum diese Funktion notwendig ist. Gibt es eine Praxis, die diese Funktion erfordert?
Und ich habe gehört, dass diese Funktion in altem C ++ nicht existiert. Wann wurde es dann eingeführt? C ++ 03? C ++ 11?
Antworten:
Der injizierte Klassenname bedeutet, dass er
X
als Mitglied von deklariert istX
, sodass bei der Namenssuche im InnerenX
immer die aktuelle Klasse gefunden wird, nicht eine andereX
, die möglicherweise im selben umschließenden Bereich deklariert wird, zErstellt die
create()
Funktion ein temporäresX
Objekt oder ruft sie die Funktion aufX
? Im Namespace-Bereich würde es die Funktion aufrufen. Der Zweck des injizierten Klassennamens besteht also darin, sicherzustellen, dass innerhalb des Hauptteils desX
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-IDFoo<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:
Der zweite Satz wurde von DR 147 geändert, so dass C ++ 03 in [Klasse] / 2 sagt:
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:
quelle