Questa è una discussione interessante Chiaramente le matrici di ref sono del tutto illegali, ma IMHO il motivo per cui non è così semplice come dire "non sono oggetti" o "non hanno dimensioni". Vorrei sottolineare che gli array stessi non sono oggetti a tutti gli effetti in C / C ++ - se ti opponi a questo, prova a creare un'istanza di alcune classi di modelli stl usando un array come parametro di modello 'class' e vedi cosa succede. Non puoi restituirli, assegnarli, passarli come parametri. (un parametro di array viene trattato come un puntatore). Ma è legale creare array di array. I riferimenti hanno una dimensione che il compilatore può e deve calcolare - non puoi sizeof () un riferimento, ma puoi creare una struttura contenente nient'altro che riferimenti. Avrà una dimensione sufficiente per contenere tutti i puntatori che implementano i riferimenti. Puoi'
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
In effetti è possibile aggiungere questa linea alla definizione della struttura
struct mys {
...
int & operator[]( int i ) { return i==0?a : i==1? b : c; }
};
... e ora ho qualcosa che sembra MOLTO come una serie di ref:
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
Ora, questo non è un array reale, è un sovraccarico dell'operatore; non farà cose che le matrici normalmente fanno come sizeof (arr) / sizeof (arr [0]), per esempio. Ma fa esattamente quello che voglio fare una serie di riferimenti, con C ++ perfettamente legale. Tranne (a) è una seccatura da impostare per più di 3 o 4 elementi, e (b) sta facendo un calcolo usando un gruppo di?: Che potrebbe essere fatto usando l'indicizzazione (non con la normale indicizzazione C-pointer-calcolo-semantica , ma indicizzando comunque). Mi piacerebbe vedere un tipo 'array di riferimento' molto limitato che può effettivamente farlo. Vale a dire una matrice di riferimenti non verrebbe trattata come una matrice generale di cose che sono riferimenti, ma piuttosto sarebbe una nuova "matrice di riferimento" fare con i modelli).
questo probabilmente funzionerebbe, se non ti dispiace questo tipo di cattiva: rifusione '* this' come un array di int * 'e restituisce un riferimento fatto da uno: (non raccomandato, ma mostra come il giusto' array ' funzionerebbe):
int & operator[]( int i ) { return *(reinterpret_cast<int**>(this)[i]); }