Bu enteresan bir tartışma. Açıkçası başvuru dizileri tamamen yasadışıdır, ancak IMHO'nun nedeni 'nesneler değiller' veya 'boyutları yok' demek kadar basit değildir. Dizilerin kendilerinin C / C ++ 'da tam teşekküllü nesneler olmadığını belirtmek isterim - buna itiraz ederseniz, bir dizi' sınıf 'şablon parametresi olarak kullanarak bazı stl şablon sınıflarını başlatmayı deneyin ve ne olduğunu görün. Onları iade edemez, atayamaz, parametre olarak geçiremezsiniz. (bir dizi parametresi bir işaretçi olarak kabul edilir). Ancak dizi dizisi yapmak yasaldır. Referansların derleyicinin hesaplayabileceği ve hesaplaması gereken bir boyutu vardır - bir referansı sizeof () edemezsiniz, ancak referanslardan başka hiçbir şey içermeyen bir yapı oluşturabilirsiniz. Referansları uygulayan tüm işaretçileri içerecek büyüklükte olacaktır. Yapabilirsin'
struct mys {
int & a;
int & b;
int & c;
};
...
int ivar1, ivar2, arr[200];
mys my_refs = { ivar1, ivar2, arr[12] };
my_refs.a += 3 ;
Aslında bu satırı yapı tanımına ekleyebilirsiniz
struct mys {
...
int & operator[]( int i ) { return i==0?a : i==1? b : c; }
};
... ve şimdi bir dizi başvuruya çok benzeyen bir şeye sahibim:
int ivar1, ivar2, arr[200];
mys my_refs = { ivar1, ivar2, arr[12] };
my_refs[1] = my_refs[2] ;
&my_refs[0];
Şimdi, bu gerçek bir dizi değil, bu bir operatör aşırı yüklemesi; örneğin sizeof (arr) / sizeof (arr [0]) gibi dizilerin normalde yaptığı şeyleri yapmaz. Ama bir dizi referansın tam olarak yasal C ++ ile yapmasını istediğim şeyi yapıyor. (A) 3 veya 4 öğeden fazlasını ayarlamak zor ve (b) bir grup?: Kullanarak bir hesaplama yapmak dışında, indeksleme kullanılarak yapılabilir (normal C-işaretçi-hesaplama-anlamsal indekslemeyle değil , ancak yine de indeksleme). Bunu gerçekten yapabilen çok sınırlı bir 'başvuru dizisi' türü görmek istiyorum. Yani bir referans dizisi, referans olan genel bir şeyler dizisi olarak ele alınmaz, bunun yerine yeni bir 'referans dizisi' olur. şablonlarla yapın).
Eğer bu türden iğrenç olanı aldırmazsanız muhtemelen işe yarar: '* this' dizisini int * 'lerden oluşan bir dizi olarak yeniden oluşturun ve bir:' den yapılan bir referansı döndürür: (önerilmez, ancak doğru 'dizi'nin nasıl olduğunu gösterir. işe yarar):
int & operator[]( int i ) { return *(reinterpret_cast<int**>(this)[i]); }