Esta es una discusión interesante. Claramente, las matrices de referencias son completamente ilegales, pero en mi humilde opinión, la razón por la cual no es tan simple como decir 'no son objetos' o 'no tienen tamaño'. Señalaría que las matrices en sí mismas no son objetos completos en C / C ++: si se opone a eso, intente crear instancias de algunas clases de plantillas stl utilizando una matriz como parámetro de plantilla de 'clase' y vea qué sucede. No puede devolverlos, asignarlos, pasarlos como parámetros. (un parámetro de matriz se trata como un puntero). Pero es legal hacer matrices de matrices. Las referencias tienen un tamaño que el compilador puede y debe calcular: no puede sizeof () una referencia, pero puede hacer una estructura que contenga nada más que referencias. Tendrá un tamaño suficiente para contener todos los punteros que implementan las referencias. Usted puede'
struct mys {
int & a;
int & b;
int & c;
};
...
int ivar1, ivar2, arr[200];
mys my_refs = { ivar1, ivar2, arr[12] };
my_refs.a += 3 ; // add 3 to ivar1
De hecho, puede agregar esta línea a la definición de estructura
struct mys {
...
int & operator[]( int i ) { return i==0?a : i==1? b : c; }
};
... y ahora tengo algo que se parece MUCHO a una serie de referencias:
int ivar1, ivar2, arr[200];
mys my_refs = { ivar1, ivar2, arr[12] };
my_refs[1] = my_refs[2] ; // copy arr[12] to ivar2
&my_refs[0]; // gives &my_refs.a == &ivar1
Ahora, esto no es una matriz real, es una sobrecarga del operador; no hará cosas que las matrices normalmente hacen como sizeof (arr) / sizeof (arr [0]), por ejemplo. Pero hace exactamente lo que quiero que haga una serie de referencias, con C ++ perfectamente legal. Excepto (a) es difícil configurar más de 3 o 4 elementos, y (b) está haciendo un cálculo usando un montón de? , pero no obstante la indexación). Me gustaría ver un tipo muy limitado de "matriz de referencia" que realmente puede hacer esto. Es decir, una matriz de referencias no se trataría como una matriz general de cosas que son referencias, sino que sería una nueva 'matriz de referencia' hacer con plantillas).
Esto probablemente funcionaría, si no le importa este tipo de desagradable: reescriba '* this' como una matriz de int * 's y devuelva una referencia hecha desde uno: (no recomendado, pero muestra cómo la' matriz 'adecuada trabajaría):
int & operator[]( int i ) { return *(reinterpret_cast<int**>(this)[i]); }