2014-09-06 6 views
1

Я попытался скомпилировать:Связать ссылку lvalue с ссылкой на rvalue?

int &&a=3; 
int &b=a; 

И это работает. Я знаю, что «a» - это значение lvalue, но почему я могу привязать ссылку «rvalue to int» к «lvalue reference to int (не к ссылке rvalue для int)»? Таким образом, я могу изменить значение временного, 3:

b=5 //changing the value of the temporary bound to the rvalue reference 

Этого tecnique используется из станда :: вперед, поэтому я полагаю, что это стандартное поведение. Является ли ссылкой rvalue на int, рассматриваемой как простая int lvalue, сохраняющая временную? Если нет, как вы объясните привязку?

ответ

5

Ссылки не привязываются к другим ссылкам; они привязываются к объектам.

Когда инициализируем a из 3, создать новый, временный объект intwhose lifetime is extended. b - это просто еще одна ссылка на этот объект.

Обратите внимание, что aявляется именующим, потому что этим выражение именования объекта, даже если он имеет тип «Rvalue-ссылку на int»! Будьте осторожны, чтобы не путать типов с значениями категорий, здесь: типы относятся к объектам, а категории значений относятся к выражениям (даже если эти выражения называют или иным образом оценивают какой-либо объект).

Эти запутывающие правила полностью вписываются друг в друга, когда вы думаете об этом: для того, чтобы исходная ссылка была действительной, срок службы объекта должен быть расширен, поэтому инициализация b безопасна.

+0

Но, я знаю, что только ссылка const lvalue может быть привязана к временному. Есть ли какое-либо правило, позволяющее простой ссылке lvalue привязываться к временному, если его срок жизни расширен? – Toccio

+0

@Toccio: Это неправда. Только ссылки const lvalue (и ссылки rvalue) могут быть привязаны к объекту, доступ к которому осуществляется через выражение rvalue. Но 'a' является выражением lvalue, потому что оно относится к _name_ объекта. Это не имеет большого значения, чем объект, на который ссылаются ссылки, является временным. –

+0

Еще один вопрос: когда я свяжу ссылку lvalue A с другой ссылкой на Lvalue, которая ссылается на C, что я действительно делаю, это привязка A к C правильно? Итак, если B является ссылкой на rvalue, а C является временным, это похоже на привязку A к C? – Toccio

Смежные вопросы