暂时延长使用寿命
Temporary lifetime extension
标准的第12.2.5节说:
在函数调用中临时绑定到引用参数 (5.2.2(一直持续到包含叫。在函数返回中临时绑定到返回值语句 (6.6.3( 一直保留到函数退出。在所有这些事例,在表达式求值期间创建的临时初始化引用,但临时引用除外引用是绑定的,在完整表达式的末尾被销毁它们的创建顺序与完成顺序相反他们的建设。
我正在尝试理解以下代码:
#include <iostream>
const int& foo(const int& fooRef)
{
return fooRef;
} // #0
int main (void)
{
const int& numberRef = foo(5); // #1
std::cout << numberRef; // #2
return 0;
}
在线#1
创建一个临时对象并将其绑定到 fooRef
。 fooRef
在第 #0
行被销毁。我认为临时应该在这里销毁,因为寿命延长不是传递的。
问题:
until the function exits
是什么意思?这是否意味着untill it finished executing
?为什么我会得到
5
输出。临时对象是否仍然存在于第#2
行?如何解释标准报价以弄清楚此示例的工作原理?
该标准的分步原子演练将不胜感激。谢谢!
附言这里接受的答案还告诉代码是broken
的,我不明白,为什么我得到这样的程序输出。
函数退出之前是什么意思?这是否意味着直到它完成执行?
是的。
取消引用未为什么我会得到 5 输出。临时对象是否仍然存在于第 #2 行?
绑定到活动对象的引用是未定义的行为,因此您可能会获得5
以及42
以及其他任何内容(包括崩溃(。您根本无法对具有未定义行为的程序有任何期望。
如何解释标准报价以弄清楚此示例的工作原理?
就像你已经做过的那样。临时参数绑定到函数参数 fooRef
,从函数返回时被销毁。由于该临时对象绑定到返回值,因此当函数返回时,该对象将不复存在。稍后,您将取消引用一个悬空引用,这将为您提供 UB。
-
这意味着直到右大括号,即
}
. -
您调用了 UB,您有一个悬而未决的引用。
尝试对代码进行以下修改,看看它打印的内容。它可能会打印6
因为这是堆栈上的最后一个。或者尝试传递std::string
,您可能会崩溃。
int main (void)
{
const int& numberRef = foo(5);
foo(6);
std::cout << numberRef;
return 0;
}
- 理解boost::asio-async_read在无需读取内容时的行为
- 当回溯以零开始时,如何调试崩溃
- 为"adjacent"变量赋值时出现问题
- CMake-按正确顺序将项目与C运行时对象文件链接
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 在Ubuntu 16.04上安装Cilk时出现问题
- 编译时未启用intel oneApi CUDA支持
- QGraphicsPolygonItem在拖动时未更新QPolygonF坐标
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 访问者访问变体并返回不同类型时出错
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '