Esta é uma discussão interessante. Claramente, matrizes de árbitros são totalmente ilegais, mas IMHO a razão pela qual não é tão simples como dizer 'eles não são objetos' ou 'eles não têm tamanho'. Eu apontaria que as próprias matrizes não são objetos completos no C / C ++ - se você se opuser a isso, tente instanciar algumas classes de modelo stl usando uma matriz como parâmetro de modelo de 'classe' e veja o que acontece. Você não pode devolvê-los, atribuí-los, passá-los como parâmetros. (um parâmetro de matriz é tratado como um ponteiro). Mas é legal fazer matrizes de matrizes. As referências têm um tamanho que o compilador pode e deve calcular - você não pode sizeof () uma referência, mas pode criar uma estrutura contendo nada além de referências. Ele terá um tamanho suficiente para conter todos os ponteiros que implementam as referências. Você pode'
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
Na verdade, você pode adicionar esta linha à definição de estrutura
struct mys {
...
int & operator[]( int i ) { return i==0?a : i==1? b : c; }
};
... e agora eu tenho algo que se parece muito com uma variedade de referências:
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
Agora, isso não é uma matriz real, é uma sobrecarga de operador; ele não fará coisas que as matrizes normalmente fazem como sizeof (arr) / sizeof (arr [0]), por exemplo. Mas faz exatamente o que eu quero que uma matriz de referências faça, com C ++ perfeitamente legal. Exceto (a) é difícil configurar mais de 3 ou 4 elementos e (b) está fazendo um cálculo usando um monte de?: O que pode ser feito usando a indexação (não com a indexação normal de C-ponteiro-cálculo-semântica) , mas indexando). Eu gostaria de ver um tipo muito limitado de 'matriz de referência' que realmente pode fazer isso. Ou seja, uma matriz de referências não seria tratada como uma matriz geral de coisas que são referências, mas seria uma nova 'matriz de referência' fazer com modelos).
isso provavelmente funcionaria, se você não se importar com esse tipo de desagradável: reformule '* this' como uma matriz de int * 's e retorne uma referência feita a partir de uma: (não recomendado, mas mostra como a' matriz 'adequada trabalharia):
int & operator[]( int i ) { return *(reinterpret_cast<int**>(this)[i]); }