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

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

本文关键字:是否是 未定义 引用 我可以      更新时间:2023-10-16

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

源代码:

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

打印20

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

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

不,它不是未定义的行为(UB)。这很好 - 您可以在此处修改临时的内容(只要引用在临时的生存期内有效,在这种情况下,绑定到右值引用会将右值的生存期扩展到引用的生存期)。

一个更普遍的问题是;通过右值引用修改临时是 UB 吗?不,它不是 UB。移动语义,其中"移动到"对象"窃取"移动自"对象的内容,依赖于这一点来很好地定义。

获取对临时引用的引用会将其生存期延长到该引用的生存期结束。

ISO/IEC 14882 § 12.2/5:

第二个上下文是当引用绑定到临时时。引用的临时 绑定或作为引用绑定到的子对象的完整对象的临时对象保留 对于参考的生命周期 [...]