Почему я могу присвоить существующую ссылку литеральному значению в C ++? - PullRequest
0 голосов
/ 11 января 2009

Рассмотрим следующее:

int ival = 1.01;
int &rval = 1.01; // error: non-const reference to a const value.
int &rval = ival;

rval = 1.01;

Первое присвоение & rval литеральному значению завершается неудачно, как и ожидалось. Если я закомментирую эту строку, код компилируется и запускается. Я понимаю, почему инициализация не удалась, но я запутался, почему присвоение rval работает в последней строке. Я не думал, что разрешено присваивать ссылку буквальному значению.

РЕДАКТИРОВАТЬ: Спасибо за быстрые ответы. Я испытываю желание удалить это, чтобы скрыть свой стыд, но я думаю, что оставлю это здесь, чтобы все остальные могли указать и смеяться.

В целях собственной безопасности я работаю над упражнениями из книги (учебник по С ++), и эта проблема касается справочной информации инициализация . Тем не менее, это довольно неловко, что так сильно упустил из виду точку отсчета в первую очередь. :)

Ответы [ 3 ]

6 голосов
/ 11 января 2009

После инициализации ссылки это псевдоним для того, для чего она была инициализирована. После инициализации ссылки вы не можете изменить то, на что ссылается ссылка. Однако вы можете изменить «вещь», на которую ссылается ссылка (если ссылка не const).

Последняя строка устанавливает переменную ival в 1,01 (снова).

6 голосов
/ 11 января 2009

ival не является литеральным значением, 1.01 является литеральным значением. Он был скопирован в ival, которая является переменной, которая, безусловно, может иметь ссылки на другую переменную.

4 голосов
/ 11 января 2009

Вы можете удивиться, обнаружив, что может сделать:

const int& x = 42;        // No error!

C ++ позволяет инициализировать ссылку const литеральным значением (или другим значением r). На самом деле происходит то, что компилятор создает временный объект путем копирования RHS и инициализирует ссылку для ссылки на этот временный объект. Компилятор гарантирует, что временный код остается в живых до выхода из области (т. Е. Всякий раз, когда x выходит из области действия в этом случае).

Обратите внимание, что это не работает при инициализации переменных-членов класса.

Хитрый а? :)

...