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

时间:2016-02-10 12:52:09

标签: c++ c++11 language-lawyer undefined-behavior rvalue-reference

更新问题counter_cache with has_many :through

源代码:

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

打印20

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

3 个答案:

答案 0 :(得分:13)

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

答案 1 :(得分:6)

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

更普遍的问题是;是通过右值引用修改临时UB吗?不,不是UB。移动语义,其中&#34;移动到&#34;对象&#34;抢断&#34; &#34;移动&#34;对象的内容,依赖于它的定义。

答案 2 :(得分:3)

引用临时文件会将其生命周期延长到该引用的生命周期结束。

ISO / IEC14882§12.2/ 5:

  

第二个上下文是引用绑定到临时的。引用所在的临时值   绑定或临时,即绑定引用的子对象的完整对象仍然存在   在参考文献的生命周期 [...]