константная ссылка на неконстантный объект - PullRequest
12 голосов
/ 13 сентября 2011

В следующем случае будет ли создан временный объект до того, как константная ссылка будет использована для неконстантного объекта?

const int y = 2000;
const int &s = y // ok, const reference to const object.

int x = 1000;
const int &r = x; // any temporary copy here?

Если нет, то как это работает?

   const int z = 3000;
   int &t = z // ok, why can't you do this?

Ответы [ 3 ]

16 голосов
/ 13 сентября 2011

Нет.

Ссылка - это просто псевдоним существующего объекта.const обеспечивается компилятором;он просто проверяет, что вы не пытаетесь изменить объект с помощью ссылки r. *. Для этого не требуется создавать копию.

Учитывая, что constпросто инструкция компилятору для принудительного применения «только для чтения», тогда сразу должно быть очевидно, почему ваш последний пример не компилируется.const было бы бессмысленно, если бы вы могли тривиально обойти его, приняв не const ссылку на const объект.

* Конечно, вы все еще можете изменять объект с помощьюx.Любые изменения также будут видны через r, поскольку они ссылаются на один и тот же объект.

5 голосов
/ 13 сентября 2011

В

int x = 1000;
const int &r = x;

правая часть - lvalue , а тип x совпадает с типом ссылки (игнорируя квалификации cv). При этих обстоятельствах ссылка прикрепляется непосредственно к x, временное создание не создается.

Что касается "как это работает" ... Я не понимаю, что вызвало ваш вопрос. Это просто работает самым простым способом: ссылка привязана непосредственно к x. Ничего больше.

Вы не можете сделать

const int z = 3000;
int &t = z;

потому что он немедленно нарушает правила правильности.

1 голос
/ 24 июня 2014

Ответ на этот вопрос (&) отвечает на этот вопрос.

Ссылка - это просто псевдоним переменной, которой она назначена ..

И const - это ограничение, накладываемое компилятором на переменную, объявленную как const

int x = 1000;
const int &r = x;

В данном случае это константная ссылка на неконстантную переменную. Таким образом, вы не можете изменить данные x с помощью ссылочной переменной r (просто действует только для чтения) .. все же вы можете изменить данные x, изменив x

const int z = 3000;
int &t = z

В этом случае неконстантная ссылка на константный член, который не имеет смысла. Вы говорите, что reference может позволить вам редактировать константный член (что никогда не возможно) ..

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

const int z = 3000;
const int &t = z;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...