Кто-либо может объяснить мне, почему существует различие между этими двумя операторами?
class A{};
const A& a = A(); // correct
A& b = A(); // wrong
Это говорит что недопустимая инициализация ссылки неконстанты типа A&
от временного файла типа A
Почему делает const
иметь значение здесь?
Неконстантные ссылки должны быть инициализированы 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);
В языке C ++ запрещено прикреплять неконстантную ссылку к rvalue, тогда как присоединение константной ссылки к rvalue совершенно нормально. Например, это допустимо
const int& r = 5;
, в то время как это не
int &r = 5; // ERROR
Временный объект типа A
, возвращаемый выражением A ()
, является r-значением, поэтому применяется указанное выше правило и в вашем случае.
Для временного/значения вы можете иметь только const ссылку.
Вы можете иметь неконстантную ссылку на не временное/значение.
A a;
A& b = a;
Я полагаю, что причина в том, чтобы усилить тот факт, что rvalue является временным, так как мало пользы от возможности модифицировать то, что исчезнет через мгновение.
Терминология в этом вопросе немного запутана; возможно, вы захотите изучить ее немного подробнее. Вот краткий ответ:
Вы присваиваете временный объект (результат вызова конструктора класса) переменной. Временный объект - это R-значение. Вы не можете присвоить R-значение неконстантной ссылке.
Вы можете присвоить R-значение const-ссылке, хотя причина, по которой это разрешено, довольно неясна.