Це цікава дискусія. Очевидно, що масиви посилань прямо неправомірні, але причина ІМХО не є такою простою, як сказати "вони не є об'єктами" або "вони не мають розміру". Я зазначу, що самі масиви не є повноцінними об'єктами в C / C ++ - якщо ви заперечуєте проти цього, спробуйте створити кілька класів шаблонів stl, використовуючи масив як параметр шаблону 'class', і подивіться, що відбувається. Ви не можете їх повернути, призначити, передати їх як параметри. (параметр масиву трактується як вказівник). Але законно робити масиви масивів. Посилання мають розмір, який компілятор може і повинен обчислити - ви не можете розмістити () посилання, але ви можете створити структуру, що не містить нічого, крім посилань. Він матиме достатній розмір, щоб містити всі покажчики, які реалізують посилання. Ти можеш'
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; }
};
... і тепер у мене є щось, що виглядає багато, як масив refs:
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 ++. За винятком (a) больових налаштувань для більш ніж 3-х або 4-х елементів, і (b) він робить обчислення за допомогою пучка?: Що можна зробити за допомогою індексації (не з нормальною індексацією семантики C-pointer-розрахунку-семантики) , але все-таки індексація). Я хотів би бачити дуже обмежений тип "масиву посилань", який може насправді зробити це. Тобто масив посилань не трактуватиметься як загальний масив речей, які є посиланнями, а, скоріше, це буде новий "масив посилань" зробити за допомогою шаблонів).
це, мабуть, спрацює, якщо ви не заперечуєте проти такого типу противного: переробіть '* this' як масив int * 's і поверніть посилання, зроблене з одного: (не рекомендується, але це показує, як правильний' масив ' буде працювати):
int & operator[]( int i ) { return *(reinterpret_cast<int**>(this)[i]); }