临时寿命延长

标准的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行创建一个临时对象并绑定到foo fooRef参数。 #0行销毁fooRef 。 所以我认为临时应该在这里销毁,因为终身延长不是传递性的。

问题:

  • until the function exits意味着什么? 这是否意味着untill it finished executing

  • 为什么我会得到5输出。 #2行是否还存在临时对象?

  • 我如何解释标准报价以找出这个例子的工作原理?

  • 我们将非常感谢参考标准的逐步原子漫步。 谢谢!

    PS这里接受的答案也告诉代码被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;
    }
    
    链接地址: http://www.djcxy.com/p/72273.html

    上一篇: Temporary lifetime extension

    下一篇: How to do Vertical+Horizontal centering in CSS