постоянная ссылка на указатель - PullRequest
3 голосов
/ 08 июля 2020
int val2 = 38;
int *ptr = &val2;
const int *&ptrRef = ptr; // ERROR

int i = 92;
int &ref_i = i;
const int &ref_i2 = ref_i;

Здравствуйте, может кто-нибудь объяснить, почему у меня не может быть константной ссылки, которая ссылается на неконстантный указатель? Я думал, что если вы получите доступ к идентификатору const ref, он будет рассматривать val2 как const. Когда вы обращаетесь к ptr, он будет рассматривать val2 как неконстантный. Как и нижняя часть кода, который работает. Я не понимаю, почему это не работает с указателями. Спасибо вам огромное!

Ответы [ 2 ]

4 голосов
/ 08 июля 2020

Думаю, ваш вопрос сводится к простой опечатке. Если вам нужна константная ссылка на неконстантный указатель, используйте следующее:

int* const&  ptrRef = ptr; // no error

Это объявляет ptrRef как константную ссылку на неконстантный указатель. Другой, возможно, более чистый вариант - ввести typedef:

 using intptr = int *;
 const intptr& ptrRef = ptr;

Кроме того, вы можете выйти из бизнеса, полностью указав тип вручную:

const auto&  ptrRef = ptr; // no error

И, для хорошей меры , это тоже сработает (как при компиляции), если это то, что вы хотите:

const int* const&  ptrRef = ptr; // no error

Последний бит объявляет постоянную ссылку на постоянный указатель.

4 голосов
/ 08 июля 2020

East-const делает понятнее:

int const * & ptrRef = ptr; // ERROR

Это указатель, который является const. Однако ptr - это другой тип. Вы не можете привязать ссылку к другому типу. Требуется преобразование, в результате чего инициализатор становится временным (ptr преобразован в int const*).

Теперь есть более запутанный улов: ссылки на константы могут связываться с временными , продлевая их время жизни: Почему ссылки на константы продлевают время жизни rvalue?

Они, например, позволяют функциям принимать аргументы от const& и по-прежнему вызывать их с помощью временных файлов:

void foo(std::string const&);

foo("foor"s+"bar"s); // still ok
...