我可以使用rvalue引用临时吗?这是不确定的行为?

vla*_*don 12 c++ undefined-behavior rvalue-reference language-lawyer c++11

更新问题为什么这两个右值引用示例有不同的行为?:

源代码:

int a = 0;
auto && b = a++;
++a;
cout << a << b << endl;
Run Code Online (Sandbox Code Playgroud)

版画 20

是否ba++通话后使用未定义的行为(UB)?也许我们不能使用,b因为它指的是暂时的?

Ker*_* SB 13

代码很好.b指的是一个生命周期扩展的对象a++,它是表达式的结果,它是一个不同的对象a.(将临时对象绑定到引用会将对象的生命周期延伸到引用的生命周期.)您可以使用和修改这两个对象.


Nia*_*all 7

不,它不是未定义的行为(UB).没关系 - 你可以在这里修改临时的内容(只要引用对临时的生命周期有效,在这种情况下,对rvalue引用的绑定会将rvalue的生命周期延长到引用的生命周期).

一个更普遍的问题是; 是通过右值引用修改临时UB吗?不,不是UB.移动语义,其中"移动"对象"窃取""移动"对象的内容,依赖于此定义.

  • 是的.然后`auto &&`不是右值引用,引用崩溃使得b是`int&`并且通常会绑定一个左值引用. (6认同)