2016-06-10 15 views
9

Wie ich verstehe, in C++, eine Klasse in Funktion Parameterliste deklariert automatisch auf den umgebenden Gültigkeitsbereich geht:Klassendeklaration innerhalb Funktion Parameterliste

void f(struct A *p) {} 

void g() { A *p; f(p); } 

entspricht:

struct A; 

void f(A *p) {} 

void g() { A *p; f(p); } 

Was Abschnitt im C++ - Standard gibt dieses Verhalten an? Was ist mit C?

Nun, ich denke, C folgt in diesem Fall nicht C++. Visual Studio nicht diesen Code kompilieren C-Modus:

void g(struct A { int a; } a); 

struct A a;  // 'a' uses undefined struct 'A' 
+1

Ihr letztes Beispiel kompiliert auch nicht in C++. – molbdnilo

+0

Ja, ich habe vergessen zu beachten, dass C++ keine Klassendefinition innerhalb der Funktionsparameterliste erlaubt.Ich meinte, dass C nicht C++ in dem Fall folgt, in dem die Klassendeklaration innerhalb der Parameterliste in den Funktionsdeklarationsbereich "leckt". – igntec

Antwort

3

Dies ist ein erarbeitet-Typ-Spezifizierer. Die entsprechende Quote in C++ 14:

[basic.lookup.elab]/2: [...] Wenn die Erarbeitet-type-specifier von eingeführt wird, die Klasse-Schlüssel und diese Lookup finden nicht ein zuvor erklärt Typname name~~POS=HEADCOMP, oder wenn die erarbeitet-Typ-Spezifizierer erscheint in einer Erklärung mit der Form:

class-key attribute-specifier-seqopt identifier ; 

die e laborated-type-specifier ist eine Deklaration, die den Klassennamen wie in 3.3.2 beschrieben einführt.

Dies erklärt den Klassennamen wie folgt:

[basic.scope.pdecl]/7: der Deklaration einer Klasse zunächst in einem erklärt erarbeitet Typ-Spezifizierer wie folgt:

- [. ..]

- für eine erarbeitet-Typ-Spezifizierer der Form

class-key identifier 

wenn die ausgearbeitet-Typ-Spezifizierer im DECL-Spezifizierer-seqoder Parameter-Erklärung-Klausel einer Funktion im Namensraum Umfang definiert verwendet wird, der Identifikator als Klassen- deklariert Name im Namespace, der die Deklaration enthält; Andernfalls wird der Bezeichner, mit Ausnahme der Friend-Deklaration, im kleinsten Namespace oder Blockbereich mit der Deklaration deklariert.

So weil struct A ist ein erarbeitet-Typ-Spezifizierer und A wurde bisher nicht erklärt worden, A wird im Namensraum deklariert, der die Erklärung enthält (in diesem Fall der globalen Namensraum).

Verwandte Themen