我可以临时使用右值引用吗?它是否是未定义的行为?

Can I use rvalue reference to temporary? Is it undefined behavior or not?

正在更新问题

源代码:

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

打印20

a++ 调用后使用 b 是否是未定义行为 (UB)?也许我们不能使用 b 因为它指的是临时的?

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

不,这不是未定义的行为 (UB)。没关系 - 您可以在此处修改临时文件的内容(只要引用在临时文件的生命周期内有效,在这种情况下,绑定到右值引用会将右值的生命周期延长到引用的生命周期)。

一个更普遍的问题是;通过右值引用修改临时是UB吗?不,它不是 UB。移动语义,其中 "moved-to" 对象 "steals" "moved-from" 对象的内容,依赖于此得到很好的定义。

引用临时对象将其生命周期延长至该引用的生命周期结束。

ISO/IEC 14882 § 12.2/5:

The second context is when a reference is bound to a temporary. The temporary to which the reference is bound or the temporary that is the complete object of a subobject to which the reference is bound persists for the lifetime of the reference […]