int &z = 12;
В правой части временный объект типа int
создается из целочисленного литерала 12
, но временный объект не может быть привязан к неконстантной ссылке. Отсюда и ошибка. Это так же, как:
int &z = int(12); //still same error
Почему создается временный? Поскольку ссылка должна ссылаться на объект в памяти, и для того, чтобы объект существовал, он должен быть создан первым. Поскольку объект безымянный, это временный объект. У него нет имени. Из этого объяснения стало ясно, почему второй случай хорош.
Временный объект может быть связан с константной ссылкой, что означает, что вы можете сделать это:
const int &z = 12; //ok
C ++ 11 и Rvalue Ссылка:
Ради полноты я хотел бы добавить, что в C ++ 11 введена rvalue-reference, которая может связываться с временным объектом. Итак, в C ++ 11 вы можете написать это:
int && z = 12; //C+11 only
Обратите внимание, что &&
intead of &
. Также обратите внимание, что const
больше не нужен, хотя объект, с которым связывается z
, является временным объектом, созданным из целочисленного литерала 12
.
Поскольку в C ++ 11 введено rvalue-reference , int&
отныне называется lvalue-reference .