2013-07-30 8 views
6

Wenn das folgende C++ 11-Programm 4.7 mit gcc kompiliert:C++ 11 gcc: Explizite Qualifizierung in der Deklaration? Standard ref?

extern int i; 
int ::i; 

int main() 
{ 
} 

gcc beklagt, dass:

error: explicit qualification in declaration of `i` 

dieses nicht-konformes Verhalten ist? Wo im Programm wird dieses Programm als schlecht angesehen?

8.3p1 scheint darauf hinzudeuten, dass es erlaubt sein soll:

Wenn die Qualifier der global :: Bereichsauflösungsoperator, bezieht sich der declarator-id auf einen Namen in dem globalen Namespacebereich erklärt.

Update:

Von N3485 8.3p1:

Eine Liste von Deklaratoren erscheint nach einer optionalen (Ziffer 7) Decl-specifier-Seq (7.1). Jeder Deklarator enthält genau eine Deklarator-ID; Es benennt den Bezeichner, der deklariert ist. Eine unqualifizierte ID, die in einem Deklarator auftritt - ID soll ein einfacher Bezeichner sein, mit Ausnahme der Deklaration einiger spezieller Funktionen (12.3, 12.4, 13.5) und der Deklaration von Vorlagenspezialisierungen oder Teilspezialisierungen (14.7). Wenn die Deklarator-ID qualifiziert ist, muss die Deklaration auf ein zuvor deklariertes Mitglied der Klasse oder des Namespace verweisen, auf das sich das Qualifikationsmerkmal bezieht (oder im Falle eines Namespace eines Elements des Inline-Namespaceset dieses Namespace) (7.3.1)) oder zu einer Spezialisierung davon; das Mitglied soll nicht lediglich durch eine using-Deklaration im Rahmen der Klasse oder des Namespace eingeführt worden sein, die vom Nested-Name-Specifier der Deklarator-ID nominiert wurde. Die Verschachtelte-Name-Spezifikation einer qualifizierten Deklarator-ID darf nicht mit einem Dekltyp-Spezifizierer beginnen. [Hinweis: Wenn das Qualifikationsmerkmal der Auflösungsoperator global :: scope ist, bezieht sich die deklarator-ID auf einen Namen, der im globalen Namespacebereich deklariert ist. - Endnote] Der optionale attribute-specifier-seq nach einer deklarator-id gehört zu der deklarierten Entität.

Antwort

12

Und der nächste Satz sagt (in n3337):

A declarator-ID nicht quali fi ziert mit Ausnahme der Definition einer Memberfunktion oder statischen Datenelement außerhalb seiner Klasse sein soll die Definition oder explizite Instanziierung einer Funktion oder eines Variablenelements eines Namespaces außerhalb ihres Namensraums oder die Definition einer expliziten Spezialisierung außerhalb ihres Namensraums oder die Deklaration einer Friend-Funktion, die Mitglied einer anderen Klasse oder eines anderen Namespace ist .

Eine Definition einer globalen Variablen wird unter den Ausnahmen nicht erwähnt.

+0

Welche Dokumentversion verwenden Sie? Ich schaue auf N3485 –

+0

Ich aktualisierte meine Antwort mit dem vollständigen Absatz von N3485 8.3p1. –

+0

@ user1131467 n3337. Ich überprüfe auch n3690, gib mir eine Sekunde. – jrok

Verwandte Themen