Это интересная дискуссия. Ясно, что массивы ссылок совершенно незаконны, но ИМХО причина, почему не так просто сказать «они не объекты» или «они не имеют размера». Я хотел бы отметить, что сами массивы не являются полноценными объектами в C / C ++ - если вы возражаете против этого, попробуйте создать экземпляр некоторых классов шаблонов stl, используя массив в качестве параметра шаблона 'class', и посмотрите, что произойдет. Вы не можете вернуть их, назначить их, передать их в качестве параметров. (параметр массива рассматривается как указатель). Но допустимо создавать массивы из массивов. Ссылки имеют размер, который компилятор может и должен рассчитать - вы не можете использовать sizeof () для ссылки, но вы можете создать структуру, не содержащую ничего, кроме ссылок. Он будет иметь размер, достаточный для размещения всех указателей, которые реализуют ссылки. Ты можешь'
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
На самом деле вы можете добавить эту строку в определение структуры
struct mys {
...
int & operator[]( int i ) { return i==0?a : i==1? b : c; }
};
... и теперь у меня есть кое-что, что выглядит много как массив ссылок:
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
Теперь это не настоящий массив, это перегрузка оператора; он не будет делать то, что обычно делают массивы, например, sizeof (arr) / sizeof (arr [0]). Но он делает именно то, что я хочу, чтобы массив ссылок делал с совершенно легальным C ++. За исключением (а) неудобно устанавливать более 3 или 4 элементов, и (б) он выполняет вычисления с использованием нескольких символов?: Что можно сделать с помощью индексации (а не с помощью обычной индексации семантики C-указателя-вычисления-семантики) , но индексация тем не менее). Я хотел бы видеть очень ограниченный тип «массив ссылок», который действительно может сделать это. Т.е. массив ссылок не будет рассматриваться как общий массив вещей, которые являются ссылками, а скорее будет новым «массивом ссылок» сделать с шаблонами).
это, вероятно, сработает, если вы не возражаете против такого рода мерзостей: переделайте '* this' в массив int * и верните ссылку, сделанную из одного: (не рекомендуется, но показывает, как правильно 'array' должно сработать):
int & operator[]( int i ) { return *(reinterpret_cast<int**>(this)[i]); }