To interesująca dyskusja. Oczywiście tablice referencji są całkowicie nielegalne, ale IMHO powód, dla którego nie jest tak prosty, jak powiedzenie „nie są obiektami” lub „nie mają rozmiaru”. Zwróciłbym uwagę, że same tablice nie są pełnoprawnymi obiektami w C / C ++ - jeśli sprzeciwiasz się temu, spróbuj utworzyć instancję niektórych klas szablonów stl, używając tablicy jako parametru szablonu „class” i zobacz, co się stanie. Nie możesz ich zwrócić, przypisać, przekazać jako parametry. (parametr tablicy jest traktowany jako wskaźnik). Ale tworzenie tablic tablic jest legalne. Referencje mają rozmiar, który kompilator może i musi obliczyć - nie możesz sizeof () odwołania, ale możesz utworzyć strukturę zawierającą tylko odwołania. Będzie miał wystarczający rozmiar, aby pomieścić wszystkie wskaźniki, które implementują odwołania. Możesz'
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
W rzeczywistości możesz dodać tę linię do definicji struktury
struct mys {
...
int & operator[]( int i ) { return i==0?a : i==1? b : c; }
};
... a teraz mam coś, co wygląda DUŻO jak tablica referencji:
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
Otóż, to nie jest prawdziwa tablica, to przeciążenie operatora; nie zrobi rzeczy, które normalnie robią tablice, na przykład sizeof (arr) / sizeof (arr [0]). Ale robi dokładnie to, czego chcę, aby robił szereg odniesień, z całkowicie legalnym C ++. Z wyjątkiem (a) uciążliwa jest konfiguracja dla więcej niż 3 lub 4 elementów i (b) wykonuje obliczenia przy użyciu zestawu?: Co można zrobić za pomocą indeksowania (nie przy normalnym indeksowaniu semantyki wskaźnika C , ale mimo to indeksowanie). Chciałbym zobaczyć bardzo ograniczony typ „tablicy referencyjnej”, który faktycznie może to zrobić. To znaczy tablica odniesień nie byłaby traktowana jako ogólna tablica rzeczy, które są referencjami, ale raczej byłaby nową „tablicą referencji” zrobić za pomocą szablonów).
to prawdopodobnie zadziała, jeśli nie masz nic przeciwko temu rodzajowi nieprzyjemności: przetwórz '* this' jako tablicę int * i zwróć referencję utworzoną z jednego: (niezalecane, ale pokazuje jak właściwa 'tablica' pracowałbym):
int & operator[]( int i ) { return *(reinterpret_cast<int**>(this)[i]); }