C ++: почему у нас не может быть ссылок на ссылки или массив ссылок? - PullRequest
11 голосов
/ 23 февраля 2010

Я заметил, что нет ссылки на ссылку, но есть указатель на указатель, а также нет массива ссылок, кроме массива указателей.

Кто-нибудь может дать мне причину?

Ответы [ 4 ]

15 голосов
/ 23 февраля 2010

Указатели являются изменяемыми (если не константные), ссылки никогда. Таким образом, нет точки, имеющей указатель или ссылку на ссылку.

Кроме того, ссылка всегда должна относиться к чему-либо - такой вещи, как нулевая ссылка, не существует. Вот почему не может быть массивов ссылок, так как нет способа по умолчанию создавать экземпляры ссылок в массиве для значимого значения.

12 голосов
/ 23 февраля 2010

В соответствии со стандартом C ++ 8.3.2 / 4:

Не должно быть ссылок на ссылки, массивов ссылок и указателей на ссылки.

10 голосов
/ 23 февраля 2010

Ссылка - это абстракция на уровне языка. Это непрозрачный способ наложения переменной на другую. Хотя компилятор скрытно обрабатывает ссылки с использованием указателей, на более высоком уровне это очень разные вещи. С другой стороны, указатели явно используются программистом для достижения косвенности. Переменная-указатель - это переменная, отличная от той, на которую она указывает. Ссылка должна рассматриваться как псевдоним исходной переменной, а не как еще одна переменная, содержащая адрес. Следовательно, псевдоним для псевдонима переменной будет просто псевдонимом самой переменной. Принимая во внимание привязку, ссылка на переменную - вещь времени компиляции, которая может помочь понять причину этого поведения.

Исходя из этого, вы можете утверждать, что, поскольку массивы являются структурами, которые хранят значения, а не переменные, для них не имеет смысла хранить псевдонимы переменных. По сути, ссылочная переменная (под которой я подразумеваю указатель, если он существует, что компилятор может использовать , может использовать для связывания ссылки) невидима для программиста на уровне C ++. Если было возможно объявить массивы ссылок, компилятору, вероятно, потребовалось бы, чтобы постоянные индексы передавались в массивы, чтобы иметь возможность разрешать привязку во время компиляции.

4 голосов
/ 23 февраля 2010

C ++ Стандарт 8.3.2 / 4:

There shall be no references to references, no arrays of references, and no pointers to references.

Причина этого заключается в том, что ссылка не существует сама по себе во время выполнения. Ссылка - это просто другое название места. Они неизменны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...