9

Обновление вопрос Why this two rvalue references examples have different behavior?:Могу ли я использовать ссылку rvalue для временного? Это неопределенное поведение или нет?

Исходный код:

int a = 0; 
auto && b = a++; 
++a; 
cout << a << b << endl; 

печатает 20

Это неопределенное поведение (UB), чтобы использовать b после a++ вызова? Может быть, мы не можем использовать b, потому что это относится к временному?

+2

Этот документ может быть полезным вы: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/1993/N0345.pdf – dkg

+1

Хм, из моего понимания это не так, как значение временного из 'a ++' «перемещено» "на' b'. Но я думаю, что это может быть UB, если вы будете использовать 'auto && b = ++ a;', как в вашем примере в другом вопросе. Но я могу быть совершенно неправым, поскольку я не очень хорошо знаком с семантикой перемещения. –

+0

@dkg Является ли он актуальным для ссылок на значения r, введенные в C++ 11 ('&&')? – vladon

ответ

5

Нет, это не неопределенное поведение (UB). Это нормально - вы можете изменить содержимое временного объекта здесь (пока ссылка действительна для временного времени жизни, в этом случае привязка к ссылке rvalue продлевает это время жизни rvalue на время жизни ссылки).

Более общий вопрос: это UB, чтобы изменить временную ссылку на rvalue? Нет, это не UB. Переместите семантику, где объект «перемещенный к» «крадет» содержимое объекта «перемещенный из», полагается на это, чтобы быть четко определенным.

+0

Как насчет 'auto && b = ++ a;'? Безопасно ли использовать 'a' после этого выбора? –

+5

Да, это так. 'Auto &&' не является ссылкой rvalue, ссылки сворачиваются так, что b является 'int &' и связывает ссылку lvalue, как обычно. – Niall

+1

О, хорошо, поэтому нет никакого неявного перехода от 'a' к' b' !? спасибо –

12

Код в порядке. b относится к объекту с расширенной продолжительностью жизни, который является результатом выражения a++, который представляет собой другой объект от a. (Связывание временного объекта с ссылкой увеличивает время жизни объекта до ссылки.) Вы можете использовать и изменять оба объекта.

3

Принимая во внимание временное продление срока его службы до конца срока службы этой ссылки.

ИСО/МЭК 14882 § 12.2/5:

Второй контекст, когда ссылка связан с временным. Временный, к которому ссылка оценка или временное, что является полным объектом подобъекту, к которому ссылка привязана сохраняется в течение всего срока ссылки [...]