Dies ist eine interessante Diskussion. Es ist klar, dass Arrays von Refs absolut illegal sind, aber meiner Meinung nach ist der Grund dafür nicht so einfach zu sagen: "Sie sind keine Objekte" oder "Sie haben keine Größe". Ich möchte darauf hinweisen, dass Arrays selbst in C / C ++ keine vollwertigen Objekte sind. Wenn Sie dem widersprechen, versuchen Sie, einige STL-Vorlagenklassen mithilfe eines Arrays als Vorlagenparameter 'class' zu instanziieren, und sehen Sie, was passiert. Sie können sie nicht zurückgeben, zuweisen oder als Parameter übergeben. (Ein Array-Parameter wird als Zeiger behandelt). Es ist jedoch legal, Arrays von Arrays zu erstellen. Referenzen haben eine Größe, die der Compiler berechnen kann und muss - Sie können eine Referenz nicht sizeof (), aber Sie können eine Struktur erstellen, die nur Referenzen enthält. Die Größe reicht aus, um alle Zeiger zu enthalten, die die Referenzen implementieren. Sie können'
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
Tatsächlich können Sie diese Zeile zur Strukturdefinition hinzufügen
struct mys {
...
int & operator[]( int i ) { return i==0?a : i==1? b : c; }
};
... und jetzt habe ich etwas, das VIEL wie eine Reihe von Refs aussieht:
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
Dies ist kein echtes Array, sondern eine Operatorüberladung. Es werden keine Dinge ausgeführt, die Arrays normalerweise tun, wie z. B. sizeof (arr) / sizeof (arr [0]). Aber es macht genau das, was ich von einer Reihe von Referenzen möchte, mit vollkommen legalem C ++. Außer (a) es ist mühsam, mehr als 3 oder 4 Elemente einzurichten, und (b) es führt eine Berechnung mit einer Reihe von ?: Dies kann mithilfe der Indizierung erfolgen (nicht mit der normalen C-Zeiger-Berechnungssemantik-Indizierung) , aber trotzdem indizieren). Ich würde gerne einen sehr begrenzten 'Array of Reference'-Typ sehen, der dies tatsächlich kann. Das heißt, ein Array von Referenzen würde nicht als allgemeines Array von Dingen behandelt, die Referenzen sind, sondern es wäre ein neues 'Array von Referenzen'. mit Vorlagen machen).
Dies würde wahrscheinlich funktionieren, wenn Ihnen diese Art von Bösartigkeit nichts ausmacht: Neufassung von '* this' als Array von int * 's und Rückgabe einer Referenz aus einem: (nicht empfohlen, aber es zeigt, wie das richtige' Array ' würde funktionieren):
int & operator[]( int i ) { return *(reinterpret_cast<int**>(this)[i]); }