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

删除回忆录丶 提交于 2020-01-12 06:50:09

问题


Updating the question Why this two rvalue references examples have different behavior?:

Source code:

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

prints 20

Is it undefined behavior (UB) to use b after the a++ call? Maybe we cannot use b because it refers to a temporary?


回答1:


No it is not undefined behavior (UB). It's fine - you can modify the contents of the temporary here (so long as the reference is valid for the lifetime of the temporary, in this case the bind to the rvalue reference extends that lifetime of the rvalue to the lifetime of the reference).

A more general question is; is it UB to modify a temporary through the rvalue reference? No it is not UB. Move semantics, where the "moved-to" object "steals" the "moved-from" object's contents, relies on this to be well defined.




回答2:


The code is fine. b refers to a lifetime-extended object that is the result of the expression a++, which is a different object from a. (Binding a temporary object to a reference extends the lifetime of the object to that of the reference.) You can use and modify both objects.




回答3:


Taking a reference to a temporary extends its lifetime to the end of lifetime of that reference.

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 […]



来源:https://stackoverflow.com/questions/35315826/can-i-use-rvalue-reference-to-temporary-is-it-undefined-behavior-or-not

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!