我可以对临时使用右值引用吗?是否是未定义的行为
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。移动语义,其中"移动到"对象"窃取"移动自"对象的内容,依赖于这一点来很好地定义。
获取对临时引用的引用会将其生存期延长到该引用的生存期结束。
ISO/IEC 14882 § 12.2/5:
第二个上下文是当引用绑定到临时时。引用的临时 绑定或作为引用绑定到的子对象的完整对象的临时对象保留 对于参考的生命周期 [...]
相关文章:
- 为什么从 char 转换为 std::byte 可能是未定义的行为?
- 为什么 setjmp/longjmp 的这种用法是未定义的行为?
- std::adjacent_find(last, last) 是未定义的吗?
- 引用释放的内存是未定义的行为吗?
- vector.push_back(vector.back()+1) 是未定义的行为吗?
- 将结构 std::memcpy 转换为具有足够容量的 std::vector 是未定义的行为<char>吗?
- 为什么销毁被放置 new 覆盖的对象不是未定义的行为?
- 计算地址差异是未定义的行为吗?
- FlatBuffers C++ reinterpret_cast访问实际上是未定义的行为吗?这样做实际上可以吗?
- 在"printf"中使用标签"h"或"hh"是否涉及未定义的
- 用户定义文字的每个"normal"使用都是未定义的行为吗?
- 为什么这种类型的双关语不是未定义的行为?
- 在C++中,转换为simd类型是否有未定义的行为
- 扩展string_view是未定义的行为吗
- 为什么T是未定义的?我正在尝试实现一个用于双链表的节点类,它不喜欢我使用友元运算符后的T
- 取消引用悬空指针是否是未定义的行为
- 在排序时更改排序顺序是否是未定义的行为
- 我可以对临时使用右值引用吗?是否是未定义的行为
- 当程序执行取决于执行顺序时,是否是未定义的行为
- 在IEEE浮点实现中,当溢出导致INF时,它是否被认为是未定义的bahavior