我可以临时使用右值引用吗?它是否是未定义的行为?
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 […]
正在更新问题
源代码:
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 […]