2011-10-26 25 views
13

Encontré una función con esta firma.Pasar argumentos de matriz por referencia

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

Esta es la sintaxis para pasar una matriz de caracteres de tamaño fijo por referencia.

El hecho de que requiere paréntesis alrededor de &x me parece inusual.

Probablemente sea parte del estándar C++ 03.

¿Cómo se llama este formulario? ¿Alguien puede indicar una referencia al estándar?

C++ decl no es un amigo sin embargo:

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

No puedo apuntar a la norma, pero creo que es porque 'char & x [5]' es una matriz de referencias de 5 caracteres, no una referencia a una matriz de caracteres de longitud 5. –

+0

'C++ decl' es su amigo :-) –

+1

8.3.2 Referencias "No debe haber referencias a referencias, ni matrices de referencias, ni punteros a las referencias". –

Respuesta

11

No hay nada nuevo o inusual en la sintaxis. Lo ves todo el tiempo en C con punteros. [] tiene una precedencia mayor que &, por lo que debe ponerlo entre paréntesis si desea declarar una referencia a una matriz. Lo mismo ocurre con * (que tiene la misma precedencia que &): por ejemplo, para declarar un puntero a una matriz de 5 caracteres en C, haría char (*x)[5];. Del mismo modo, un puntero a una función que toma y devuelve un int sería int (*x)(int); (() tiene la misma precedencia que []). La historia es la misma con las referencias, excepto que las referencias están solo en C++ y existen algunas restricciones sobre qué tipos se pueden formar a partir de las referencias.

+0

+1 Para explicar el requisito de los paréntesis. ¿Dónde están documentadas las restricciones para formar tipos de referencias? –

+0

@Eddy Pronk: Me refería a la declaración que citó en su comentario a su pregunta anterior – newacct

11

No hay nada que explicar, esto es simplemente cómo las reglas de análisis para las declaraciones trabajan en 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 

Precaución: La primera versión no es válida C++, sin embargo, ya que no puede tener matrices de referencias. Esto es meramente una explicación de la sintaxis de la declaración. (Perdón por tomar tanto tiempo para hacerlo bien, y gracias a los útiles comentarios!)

Puede envolver el identificador de tipo en los niveles arbitrales de paréntesis si lo desea, por lo que también puede decir char &(x)[5] (primer caso)) o char (((&x)))[5] (segundo caso).

+0

+1: eso es correcto.) –

+0

¿Qué compilador acepta el primer formulario? gcc 4.4.5 no: error: declaración de 'x' como matriz de referencias –

+0

Excepto, por supuesto, que el primero no es legal C++, ya que no está permitido tener matrices de referencias. –

0

c++decl funciona principalmente para esto. Es un poco exigente con lo que le das.

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 

Como se señaló en otra respuesta, una serie de referencias es ilegal. El GNU C++ informes del compilador:

error: declaration of ‘x’ as array of references

Por cierto, here es un enlace a una utilidad en línea que sirve cdecl (aunque se queja de referencias porque la versión ofrecida por el sitio es C-específico).

Cuestiones relacionadas