Wo heißt es im Standard (C ++ 14), dass die folgenden zwei Deklarationen äquivalent sind?

8
%Vor%

Die letzten beiden obigen Deklarationen sind äquivalent. Beide deklarieren Objekte vom Typ A. Wo im Standard kann ich das finden oder ableiten?

    
Leon 17.04.2015, 17:28
quelle

1 Antwort

9

[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          von C (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 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 ]   

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 .

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

%Vor%

Alles ist gut, da Funktionsnamen in Basis-Spezifizierern und elaborierten Typ-Spezifizierern ignoriert werden.

    
Columbo 17.04.2015, 17:30
quelle

Tags und Links