Ini diskusi yang menarik. Array yang jelas jelas ilegal, tetapi IMHO alasan mengapa tidak sesederhana mengatakan 'mereka bukan benda' atau 'mereka tidak memiliki ukuran'. Saya akan menunjukkan bahwa array itu sendiri bukan objek yang lengkap dalam C / C ++ - jika Anda keberatan, coba instantiating beberapa kelas template stl menggunakan array sebagai parameter template 'class', dan lihat apa yang terjadi. Anda tidak dapat mengembalikannya, menetapkannya, meneruskannya sebagai parameter. (param array diperlakukan sebagai pointer). Tetapi adalah legal untuk membuat array dari array. Referensi memang memiliki ukuran yang dapat dan harus dihitung oleh kompilator - Anda tidak dapat sizeof () referensi, tetapi Anda dapat membuat struct yang hanya berisi referensi. Ini akan memiliki ukuran yang cukup untuk memuat semua pointer yang mengimplementasikan referensi. Kamu bisa'
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
Bahkan Anda dapat menambahkan baris ini ke definisi struct
struct mys {
...
int & operator[]( int i ) { return i==0?a : i==1? b : c; }
};
... dan sekarang saya memiliki sesuatu yang terlihat BANYAK seperti serangkaian referensi:
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
Sekarang, ini bukan array nyata, ini kelebihan operator; itu tidak akan melakukan hal-hal yang biasanya dilakukan array seperti sizeof (arr) / sizeof (arr [0]), misalnya. Tapi itu tidak persis apa yang saya ingin array referensi lakukan, dengan C ++ legal. Kecuali (a) itu sulit untuk mengatur lebih dari 3 atau 4 elemen, dan (b) melakukan perhitungan menggunakan sekelompok? , tetapi tetap mengindeks). Saya ingin melihat tipe 'array referensi' yang sangat terbatas yang sebenarnya dapat melakukan ini. Yaitu array referensi tidak akan diperlakukan sebagai array umum dari hal-hal yang merupakan referensi, tetapi akan menjadi 'array-referensi-baru' buat dengan templat).
ini mungkin akan berhasil, jika Anda tidak keberatan dengan jenis jahat ini: menyusun kembali '* this' sebagai array int * dan mengembalikan referensi yang dibuat dari satu: (tidak disarankan, tetapi ini menunjukkan bagaimana 'array' yang tepat) akan bekerja):
int & operator[]( int i ) { return *(reinterpret_cast<int**>(this)[i]); }