2016-06-10 22 views
9

Se ho ben capito, in C++, una classe dichiarata all'interno elenco dei parametri funzione passa automaticamente al campo di applicazione allegando:dichiarazione di Classe all'interno elenco dei parametri funzione

void f(struct A *p) {} 

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

è equivalente a:

struct A; 

void f(A *p) {} 

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

quale sezione nello standard C++ specifica questo comportamento? Che mi dici di C?

Bene, suppongo che C non segua C++ in questo caso. Visual Studio non compilare questo codice è la modalità C:

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

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

L'ultimo esempio non viene compilato in C++. – molbdnilo

+0

Sì, ho dimenticato di notare che C++ non consente la definizione della classe all'interno dell'elenco dei parametri di funzione.Intendevo dire che C non segue C++ in quel caso in cui la dichiarazione di classe all'interno dell'elenco dei parametri 'perde' nello scope di dichiarazione delle funzioni. – igntec

risposta

3

Questa è una elaborato di tipo-specifier. La citazione rilevante in C++ 14 è:

[basic.lookup.elab]/2: [...] Se la elaborato di tipo-specifier è introdotta da il class-chiave e questo di ricerca non trova un precedentemente dichiarato nome-tipo, o se il elaborato di tipo-specifier appare in una dichiarazione con la forma:

class-key attribute-specifier-seqopt identifier ; 

il e lo specificatore di tipo affannato è una dichiarazione che introduce il nome della classe come descritto in 3.3.2.

Questo dichiara il nome della classe in questo modo:

[basic.scope.pdecl]/7: Il punto di dichiarazione di una classe di prima dichiarata in un elaborato di tipo-specifier è la seguente:

- [. ..]

- per un identificatore del tipo elaborato del modulo

class-key identifier 

se il elaborato-type-specificatore è utilizzata nel decl-specificatore-seqo parametro dichiarazione clausola di una funzione definita in ambito namespace, l'identificatore viene dichiarata come classe- nome nel namespace che contiene la dichiarazione; in caso contrario, ad eccezione di una dichiarazione di amicizia, l'identificatore viene dichiarato nello spazio dei nomi o nell'ambito del blocco più piccolo che contiene la dichiarazione nello spazio dei nomi .

Quindi, a causa struct A è un elaborato di tipo-specifier e A non è stato precedentemente dichiarato, A viene dichiarata nello spazio dei nomi che contiene la dichiarazione (in questo caso, lo spazio dei nomi globale).