C'est une discussion intéressante. Il est clair que les tableaux de références sont carrément illégaux, mais à mon humble avis, la raison pour laquelle ce n'est pas si simple que de dire «ils ne sont pas des objets» ou «ils n'ont pas de taille». Je soulignerais que les tableaux eux-mêmes ne sont pas des objets à part entière en C / C ++ - si vous vous y opposez, essayez d'instancier des classes de modèle stl en utilisant un tableau comme paramètre de modèle de `` classe '', et voyez ce qui se passe. Vous ne pouvez pas les retourner, les assigner, les passer en paramètres. (un paramètre de tableau est traité comme un pointeur). Mais il est légal de créer des tableaux de tableaux. Les références ont une taille que le compilateur peut et doit calculer - vous ne pouvez pas sizeof () une référence, mais vous pouvez créer une structure ne contenant que des références. Il aura une taille suffisante pour contenir tous les pointeurs qui implémentent les références. Vous pouvez'
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
En fait, vous pouvez ajouter cette ligne à la définition de struct
struct mys {
...
int & operator[]( int i ) { return i==0?a : i==1? b : c; }
};
... et maintenant j'ai quelque chose qui ressemble beaucoup à un tableau de références:
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
Maintenant, ce n'est pas un vrai tableau, c'est une surcharge d'opérateurs; il ne fera pas des choses que les tableaux font normalement comme sizeof (arr) / sizeof (arr [0]), par exemple. Mais il fait exactement ce que je veux qu'un tableau de références fasse, avec un C ++ parfaitement légal. Sauf (a) c'est difficile de configurer plus de 3 ou 4 éléments, et (b) il fait un calcul en utilisant un tas de?: Ce qui pourrait être fait en utilisant l'indexation (pas avec l'indexation normale de C-pointer-calcul-sémantique , mais indexation tout de même). J'aimerais voir un type de «tableau de référence» très limité qui peut réellement le faire. C'est-à-dire qu'un tableau de références ne serait pas traité comme un tableau général de choses qui sont des références, mais plutôt un nouveau 'tableau-de-références' faire avec des modèles).
cela fonctionnerait probablement, si cela ne vous dérange pas ce genre de méchant: refondre '* this' comme un tableau d'int * et renvoyer une référence faite à partir de l'un: (non recommandé, mais cela montre comment le bon 'tableau' travaillerait):
int & operator[]( int i ) { return *(reinterpret_cast<int**>(this)[i]); }