[Klasse] / 2:
Ein Klassenname wird in den Bereich eingefügt, in dem er deklariert ist unmittelbar nachdem der Klassenname gesehen wurde. Der Klassenname ist auch eingefügt in den Umfang der Klasse selbst; Dies ist bekannt als die injected-class-name .
i.e. A::A::A::A
bezieht sich ebenfalls auf A
. In einigen Kontexten könnte A::A
den Konstruktor stattdessen benennen, obwohl - [class.qual] / 2 dies abdeckt und seine Anmerkung sogar Ihr Beispiel anspricht:
In einer Suche, in der Funktionsnamen nicht ignoriert werden 33 und Der nested-name-specifier benennt eine Klasse
C
- Wenn der Name, der nach dem geschachteltenNamensspezifizierer angegeben wurde, bei der Suche in
C
der Name der injizierten Klasse ist vonC
(Klausel 9) oder- in einer using-Deklaration (7.3.3), die eine Member-Deklaration ist, wenn der Name nach dem Nested-Name- specifier ist identisch mit dem Bezeichner oder der simple-template-id 's Schablonenname in der letzten Komponente des verschachtelten Namensspezifizierers ,
Der Name wird stattdessen als Konstruktor der Klasse
33 Suchvorgänge, in denen Funktionsnamen ignoriert werden, sind z Namen, die in einem geschachtelten Namen-Spezifizierer erscheinen, ein ausgearbeiteter Typ- Spezifizierer oder ein Basisspezifizierer .C
verwendet. [ Hinweis: Zum Beispiel ist der Konstruktor nicht akzeptabel Nachschlagen Ergebnis in einem elaborated-type-specifier so der Konstruktor würde nicht anstelle von injected-class-name verwendet werden. - end Notiz ]
Also in einer Aussage wie
%Vor% Funktionsnamen werden nicht ignoriert, wenn nach A::A
gesucht wird, und daher ist der Code schlecht formatiert, da A::A
sich auf den Konstruktor bezieht. Jedoch in
Alles ist gut, da Funktionsnamen in Basis-Spezifizierern und elaborierten Typ-Spezifizierern ignoriert werden.
Tags und Links c++ language-lawyer c++14