【发布时间】:2021-05-30 12:22:13
【问题描述】:
在 cppreference.com (Lifetime of a temporary) 的一篇关于引用初始化的文章中,它说:
在 return 语句中临时绑定到函数的返回值不会被扩展:它在 return 表达式的末尾立即被销毁。这样的函数总是返回一个悬空引用。
此摘录解决了通过绑定对临时对象的引用来延长其生命周期的例外情况。他们实际上是什么意思?我想过类似的事情
#include <iostream>
int&& func()
{
return 42;
}
int main()
{
int&& foo = func();
std::cout << foo << std::endl;
return 0;
}
所以foo 应该引用临时的 42。根据摘录,这应该是一个悬空引用 - 但这会打印 42 而不是一些随机值,所以它工作得很好。
我确定我在这里弄错了,如果有人能解决我的困惑,我将不胜感激。
【问题讨论】:
-
取消引用悬空引用是未定义的行为:包括打印 42、擦除硬盘驱动器或发动核战争。
-
我无法重现这个:coliru.stacked-crooked.com/a/7211be5336782f11 但是,这只是未定义的行为,一切都可能发生。
-
对不起,我是新手。所以这就是他们所说的“在 return 语句中临时绑定到函数的返回值”?只是碰巧Visual C++ 以打印42 的方式编译它?
-
@Ruperrrt "未定义的行为" 表示没有行为的定义。这并不意味着行为必须与期望不同(这本身就是一种定义)。一般来说,编译器不会特意对带有 UB 的程序做出反应,他们只是为有效程序执行规则,而对于无效程序,芯片可能会落下。
标签: c++ rvalue-reference temporary-objects