Frage

  

$ 10.2 / 4- „[Anmerkung: Auf der Suche nach oben einen Namen in   ein ausgearbeitetes Typ-Spezifizierer (3.4.4)   oder basen Spezifizierer (Ziffer 10), für   So ignoriert alle untypische Konstruktionen   Erklärungen, während Sie einen Namen aufzublicken   in einem verschachtelten-name-Bezeichner (3.4.3)   ignoriert Funktion, Variablen und   enumerator Erklärungen. "

Ich habe diese Erklärung gefunden in diesem Abschnitt sehr verwirrend, während über Namenssuche beschreiben.

void S(){}

struct S{
   S(){cout << 1;}
   void f(){}
   static const int x = 0;
}; 

int main(){ 
   struct S *p = new struct ::S;  // here ::S refers to type
   p->::S::f();

   S::x;  // base specifier, ignores the function declaration 'S'

   ::S(); // nested name specifier, ignores the struct declaration 'S'.
   delete p;
} 

Meine Fragen:

  1. Ist mein Verständnis der Regeln richtig?

  2. Warum ::S auf der Linie neu dabei automatisch auf mittlere struct S behandelt, während in den letzten Zeile ::S Mitteln die Funktionen im globalen Namespace S.

  3. Ist dieser Punkt auf eine Mehrdeutigkeit in der Dokumentation, oder es ist noch ein weiterer Tag für mich von C ++ Standard-Dokument zu bleiben weg?

War es hilfreich?

Lösung

Q1: Ich denke, so

.

Q2: Kompatibilität mit C. Wenn Sie eine struct in C deklarieren, ist der Tag-Name nur, dass ein Tag-Name. Um der Lage sein, sie in einer eigenständigen Art und Weise zu nutzen, benötigen Sie einen typedef. In C ++ müssen Sie nicht die typedef, dass Marken leben einfacher. Aber C ++ Regeln wurden durch die Notwendigkeit kompliziert können bereits vorhandene C-Header importieren, die „überlastet“ der Variablenname mit einem Funktionsnamen. Das bekannteste Beispiel dafür ist die Unix stat() Funktion, die ein struct stat* als Argument verwendet.

Q3: Standard Lesung ist in der Regel recht schwierig ... müssen Sie bereits wissen, dass es keinen Platz an anderer Stelle ist zu modifizieren, was Sie lesen. Es ist nicht verwunderlich, dass die Menschen wissen, wie zu tun, dass die Sprache Anwalt ist ...

Andere Tipps

Sie irren sich über den zweiten Kommentar. In S::x ist die S ein Name in einem verschachtelten name-Bezeichner. Was die Norm bezieht sich auf mit „Basis-Bezeichner“ ist die folgende

namespace B { struct X { }; void X() }
struct A : B::X { }; // B::X is a base-specifier

Sie sind auch nicht richtig dazu:

  

::S(); // verschachtelten name-Bezeichner, ignoriert die Strukturdeklaration ‚S'.`

Dieser Code ruft die Funktion nicht, weil ::S wäre ein geschachtelt-name-Bezeichner (es ist kein verschachtelter-name-specifier!), Sondern weil Funktionsnamen verbergen Klasse oder Aufzählungs Namen, wenn sowohl die Funktion und die Klasse / Aufzählung ist im gleichen Umfang erklärt.

FWIW, würde der folgende Code gleichermaßen gültig für Zeile 2 der Haupt

p->S::f();

Wichtig ist, dass S preceedes ein ::, die die Funktion Lookup ignorieren macht. Dass Sie :: setzen vor S hat keine Auswirkung in Ihrem Fall.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top