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
是否b
在a++
通话后使用未定义的行为(UB)?也许我们不能使用,b
因为它指的是暂时的?
Ker*_* SB 13
代码很好.b
指的是一个生命周期扩展的对象a++
,它是表达式的结果,它是一个不同的对象a
.(将临时对象绑定到引用会将对象的生命周期延伸到引用的生命周期.)您可以使用和修改这两个对象.
不,它不是未定义的行为(UB).没关系 - 你可以在这里修改临时的内容(只要引用对临时的生命周期有效,在这种情况下,对rvalue引用的绑定会将rvalue的生命周期延长到引用的生命周期).
一个更普遍的问题是; 是通过右值引用修改临时UB吗?不,不是UB.移动语义,其中"移动"对象"窃取""移动"对象的内容,依赖于此定义.