10,2/4- "[ Hinweis: Das Suchen eines Namens in einem elaborierten Typspezifizierer (3.4.4) oder Basisspezifizierer (Klausel 10) ignoriert beispielsweise alle nichttypbezogenen Deklarationen, während das Suchen eines Namens in einem verschachtelten Namensspezifizierer (3.4.3) Funktionen, Variablen und Aufzählungsdarstellungen ignoriert."
Ich habe diese Aussage in diesem Abschnitt beim Beschreiben der Namenssuche als sehr verwirrend empfunden.
void S(){}
struct S{
S(){cout << 1;}
void f(){}
static const int x = 0;
};
int main(){
struct S *p = new struct ::S; // hier bezieht sich ::S auf den Typ
p->::S::f();
S::x; // Basisspezifizierer, ignoriert die Funktionsdeklaration 'S'
::S(); // verschachtelter Namensspezifizierer, ignoriert die Strukturdarstellung 'S'.
delete p;
}
Meine Fragen:
-
Ist mein Verständnis der Regeln korrekt?
-
Warum wird
::S
in der Zeile mitnew
automatisch als structS
behandelt, während in der letzten Zeile::S
die FunktionenS
im globalen Namensraum bedeutet. -
Weist dies auf eine Unklarheit in der Dokumentation hin oder ist es einfach wieder ein Tag, an dem ich mich vom C++-Standarddokument fernhalten sollte?
2 Stimmen
Aua. Der Compiler hätte bei etwa Zeile 3 stoppen sollen und dir sagen, dass du deinen Code überarbeiten solltest.
0 Stimmen
@Greg Hewgill: oh Gelöbnis!. Compiler und Refactoring. Innovation at its best!
0 Stimmen
>> Ist es schon wieder ein Tag für mich, mich fernzuhalten von C++ Standard Dokument? - Ja.