临时终身延长

Kol*_*nya 9 c++ reference object-reference lifetime temporary-objects

标准的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;
}
Run Code Online (Sandbox Code Playgroud)

在线#1创建临时对象并绑定到fooRef参数foo.fooRef在线销毁#0.所以我认为临时应该在这里销毁,因为生命延长不是传递性的.

问题:

  1. 什么until the function exits意思?这是untill it finished executing什么意思?

  2. 为什么我得到一个5输出.临时对象是否仍然存在#2

  3. 如何解释标准引用以弄清楚此示例的工作原理?

将非常感谢参考标准的逐步原子演练.谢谢!

PS 这里接受的答案也告诉代码是broken,我没有得到,为什么我得到这样的程序输出.

And*_*owl 10

函数退出之前是什么意思?这是否意味着直到它完成执行?

是的。

为什么我得到 5 输出。第 2 行是否仍然存在临时对象?

取消引用未绑定到活对象的引用是未定义的行为,因此您可能会得到542其他任何事情一样好的结果(包括崩溃)。您不能对具有未定义行为的程序抱有任何期望。

我如何解释标准报价以弄清楚这个例子是如何工作的?

就像你已经做的一样。临时被绑定到函数参数fooRef,当从函数返回时它会被破坏。由于该临时对象绑定到返回值,因此该对象在函数返回时不再存在。稍后,您将取消对悬空引用的引用,从而为您提供 UB。