Почему указатели на ссылку недопустимы в C ++? - PullRequest
31 голосов
/ 08 января 2011

Как сам заголовок упоминает - почему указатель на ссылку недопустим, а обратное допустимо в C ++?

Спасибо.

Ответы [ 4 ]

45 голосов
/ 08 января 2011

Указатель должен указывать на объект . Ссылка не является объектом.

Если у вас есть ссылка r, то после ее инициализации каждый раз, когда вы используете r, вы фактически используете объект, на который ссылается ссылка.

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

int x;
int& rx = x;

int* px = ℞

В последней строке &rx принимает адрес объекта, на который указывает rx, поэтому он точно такой же, как если бы вы сказали &x.

14 голосов
/ 08 января 2011

Концепция высокого уровня, на которую ссылается реализация, это просто другое имя для существующего объекта . Вы можете иметь указатель на объект (или функцию), но вы не можете иметь указатель на имя объекта. По этой самой причине идея указателя на ссылку не имеет смысла. Другими словами, ссылки несущественны, в общем случае они просто не существуют в памяти. Они не существуют как нечто, на что можно указать.

Это правда, что во многих случаях на практике ссылки занимают память (и реализуются как замаскированные указатели). Но это просто деталь реализации, специфичная для некоторых конкретных контекстов. В общем случае ссылки не занимают память, , как явно указано в спецификации языка , которая непосредственно следует из спецификации языка.

4 голосов
/ 08 января 2011

Какая разница между указателем на ссылку (на объект) и указателем на реальный объект? Ссылка не может быть изменена для ссылки на другой объект. Просто используйте обычный указатель на рассматриваемый объект.

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

1 голос
/ 08 января 2011

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

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