更新问题counter_cache
with has_many :through:
源代码:
int a = 0;
auto && b = a++;
++a;
cout << a << b << endl;
打印20
在b
通话后使用a++
是未定义的行为(UB)吗?也许我们不能使用b
,因为它指的是临时的?
答案 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:
第二个上下文是引用绑定到临时的。引用所在的临时值 绑定或临时,即绑定引用的子对象的完整对象仍然存在 在参考文献的生命周期 [...]