Почему невозможно создать массив ссылок в С++?
С++. Стандарт 8.3.2/4 гласит:
Не должно быть ссылок на ссылки, нет массивов ссылок, и нет указателей на ссылки.
Но я не могу понять, почему это ограничение добавлено в С++. На мой взгляд, код ниже может быть легко скомпилирован и работает? Какова реальная причина этого ограничения?
int a = 10, b = 20;
int &c[] = {a, b};
Ответы
Ответ 1
Поскольку индексация в массив фактически определяется с помощью неявного преобразования в указатель, то арифметика указателя. Таким образом, чтобы поддержать это, вам также необходимо будет поддерживать указатели на ссылки и определить, что означает их арифметика.
Ответ 2
Потому что ссылки не являются объектами. Ссылки были в основном представлены для поддержки вызова по ссылке и возврата по ссылке без вставки &
на сайт-вызов. Вероятно, вам нужен массив указателей.
Ответ 3
Ссылка не может быть переназначена и не имеет размера.
Если бы массивы ссылок были разрешены, их поэтому пришлось бы обрабатывать особым образом.
Ответ 4
Это то, что я читал по адресу:
5.2.1 Подписчики [expr.sub]
1 Постфиксное выражение, за которым следует выражение в квадратных скобках является постфиксное выражение. Один из выражения должны иметь тип "указатель на T, а другой перечисление или интегральный тип. результатом является lvalue типа" T. "тип" Т" должен быть полностью определенным object type.61) Выражение E1 [E2] (по определению) * ((E1) + (E2)) [Примечание: см. 5.3 и 5.7 для деталей * и + и 8.3.4 для детали массивов. -end note]
-С++ Draft.
int a = 10, b = 20;
int &c[] = {a, b};
Итак, представьте, что &c[0]
будет чем-то вроде *&(c+0)
, ссылки IMHO похожи на псевдонимы. Следовательно, исходя из понятия массивов, он попытался бы разыменовать ценность, содержащуюся в ссылке, которую не хотелось бы.