Вопрос об инициализации ссылки, которая ссылается на указатель - PullRequest
0 голосов
/ 13 февраля 2019

Мы знаем, что в C ++ мы можем инициализировать ссылку с объектом / переменной типа, на который ссылается ссылка.Например, мы можем использовать переменную int для инициализации ссылки на int:

int i;
int& r=i;

Но ситуация становится запутанной, когда речь идет о ссылке на указатель.Предположим, мне нужно определить ссылку на указатель:

int* & r

Чтобы инициализировать его, нам нужно присвоить r указатель на int.Следующий код работает (продолжайте с приведенным выше кодом):

int* p = &i;
int* & r = p;

Но следующий код вызывает ошибку компиляции, даже если правая часть = действительно является указателем на int:

int* & r = &i;

Сообщение об ошибке:

'initializing': невозможно преобразовать из 'int *' в 'int * &'.

Почему?Почему компилятор может конвертировать из int в int&, но не может конвертировать из int * в int *&?Почему я могу инициализировать с p, но не с &i?Разве они не одинаковы?

PS: Я использую Visual Studio 2015 для Windows.

1 Ответ

0 голосов
/ 13 февраля 2019

Давайте воспользуемся другим компилятором и посмотрим, имеет ли это смысл:

ошибка: невозможно связать неконстантную ссылку lvalue типа 'int * &' с rvalue типа 'int *'

Эта диагностика лучше объясняет проблему.int* & является ссылочным типом lvalue.&i является выражением rvalue.Как объясняет ошибка, неконстантные lvalues ​​не могут быть привязаны к rvalue выражениям.

Не являются ли [p и &i] одинаковыми?

Онине то же самое.p - это id-выражение.Идентификаторы переменных являются lvalues.

&p выражением является унарный оператор &.Результатом оператора является prvalue.

...