Ссылочная инициализация в C++

Кто-либо может объяснить мне, почему существует различие между этими двумя операторами?

class A{};

const A& a = A();         // correct 

A& b = A();               // wrong

Это говорит что недопустимая инициализация ссылки неконстанты типа A& от временного файла типа A

Почему делает const иметь значение здесь?

9
задан Peter Alexander 17 March 2010 в 22:04
поделиться

4 ответа

Неконстантные ссылки должны быть инициализированы l-значениями. Если бы вы могли инициализировать их с помощью временных файлов, то что бы делало следующее?

int& foo = 5;
foo = 6; // ?!

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

const int& foo = 5;
foo = 6; // not allowed, because foo is const.

Помните, что ссылки на самом деле должны ссылаться на что-то, а не только на временные переменные. Например, допустимо следующее:

int foo = 5;
int& bar = foo;
bar = 6;
assert(foo == 6);
14
ответ дан 4 December 2019 в 11:04
поделиться

В языке C ++ запрещено прикреплять неконстантную ссылку к rvalue, тогда как присоединение константной ссылки к rvalue совершенно нормально. Например, это допустимо

const int& r = 5;

, в то время как это не

int &r = 5; // ERROR

Временный объект типа A , возвращаемый выражением A () , является r-значением, поэтому применяется указанное выше правило и в вашем случае.

1
ответ дан 4 December 2019 в 11:04
поделиться

Для временного/значения вы можете иметь только const ссылку.

Вы можете иметь неконстантную ссылку на не временное/значение.

A a;
A& b = a;

Я полагаю, что причина в том, чтобы усилить тот факт, что rvalue является временным, так как мало пользы от возможности модифицировать то, что исчезнет через мгновение.

1
ответ дан 4 December 2019 в 11:04
поделиться

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

Вы присваиваете временный объект (результат вызова конструктора класса) переменной. Временный объект - это R-значение. Вы не можете присвоить R-значение неконстантной ссылке.

Вы можете присвоить R-значение const-ссылке, хотя причина, по которой это разрешено, довольно неясна.

3
ответ дан 4 December 2019 в 11:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: