2011-10-26 19 views
13

Ho trovato una funzione con questa firma.Passare gli argomenti dell'array per riferimento

void foo(char (&x)[5]) 
{ 
} 

Questa è la sintassi per il passaggio di un array di dimensioni fisse per riferimento.

Il fatto che essa richiede parentesi attorno &x mi sembra insolito.

E 'probabilmente parte dello standard C++ 03.

Cos'è questo modulo chiamato e chiunque può indicare un riferimento alla norma?

C++ decl non è un amico ancora:

$ c++decl 
Type `help' or `?' for help 
c++decl> explain void foo(char (&x)[5]) 
syntax error 
+3

Non riesco a puntare allo standard, ma credo sia dovuto al fatto che 'char & x [5]' è un array di riferimenti a 5 caratteri, non un riferimento a un array di caratteri di lunghezza 5. –

+0

'C++ decl' è il tuo amico :-) –

+1

8.3.2 Riferimenti "Non ci devono essere riferimenti a riferimenti, matrici di riferimenti e nessun riferimento a riferimenti". –

risposta

11

Non c'è nulla di insolito o nuovo sulla sintassi. Lo vedi sempre in C con i puntatori. [] ha precedenza superiore a &, quindi è necessario inserirlo tra parentesi se si desidera dichiarare un riferimento a un array. La stessa cosa accade con * (che ha la stessa precedenza &): Ad esempio, per dichiarare un puntatore a un array di 5 caratteri in C, si farebbe char (*x)[5];. Analogamente, un puntatore a una funzione che accetta e restituisce un int sarebbe int (*x)(int); (() ha la stessa precedenza di []). La storia è la stessa cosa con i riferimenti, eccetto che i riferimenti sono solo su C++ e ci sono alcune restrizioni su quali tipi possono essere formati dai riferimenti.

+0

+1 Per spiegare il requisito delle parentesi. Dove sono le restrizioni sui tipi di formatura dai riferimenti documentati? –

+0

@Eddy Pronk: mi riferivo alla dichiarazione che hai citato nel tuo commento alla tua domanda sopra – newacct

11

Non c'è niente da spiegare, questo è semplicemente il modo le regole di analisi per le dichiarazioni lavorano in C++:

char & x[5] // declare x as array 5 of reference to char (not valid C++!) 
char (&x)[5] // declare x as reference to array 5 of char 

Attenzione: La prima versione non è C++ valida, tuttavia, poiché non è possibile avere matrici di riferimenti. Questa è solo una spiegazione della sintassi della dichiarazione. (Scusate se impiegare così tanto tempo per farlo bene, e grazie agli utili commenti!)

Se vi piace, potete inserire l'identificativo del tipo in livelli di parentesi se volete, quindi potete anche dire char &(x)[5] (primo caso) o char (((&x)))[5] (secondo caso).

+0

+1: giusto.) –

+0

Quale compilatore accetta il primo modulo? gcc 4.4.5 non: errore: dichiarazione di 'x' come matrice di riferimenti –

+0

Tranne, ovviamente, che il primo non è C++ legale, dal momento che non è permesso avere matrici di riferimenti. –

0

c++decl lavora per lo più per questo. È solo un po 'schizzinoso su quello che gli dai.

c++decl> explain void foo(char (&)[5]) 
declare foo as function (reference to array 5 of char) returning void 

c++decl> explain void foo(char &[5]) 
declare foo as function (array 5 of reference to char) returning void 

Come indicato in un'altra risposta, una serie di riferimenti è illegale. La GNU C++ rapporti compilatore:

error: declaration of ‘x’ as array of references

A proposito, here è un link ad un programma di utilità online che serve cdecl (anche se lamenta riferimenti perché la versione ospitata dal sito è specifico C).

Problemi correlati