C++ 绑定到函数参数的引用是否会延长该临时参数的生存期?

C++ 绑定到函数参数的引用是否会延长该临时参数的生存期?,c++,reference,object-lifetime,function-parameter,C++,Reference,Object Lifetime,Function Parameter,我有以下代码(简化版): 我无法确定C++03标准$12.2/5措辞的范围 将引用绑定到的临时对象或作为将临时对象绑定到的子对象的完整对象的临时对象在引用的生存期内保持不变 适用于这里 上述代码中的reference变量有效还是悬空?调用代码中的引用会延长作为参数传递的临时对象的生存期吗?这将编译,但最终会得到一个悬空引用参数在函数返回后被释放 调用函数时引用临时匿名对象 函数返回引用 现在函数返回了临时参数,临时参数被释放 当对象被销毁时,引用现在处于悬空状态 如果您将其设置为非常量,那么它就

我有以下代码(简化版):

我无法确定C++03标准$12.2/5措辞的范围

将引用绑定到的临时对象或作为将临时对象绑定到的子对象的完整对象的临时对象在引用的生存期内保持不变

适用于这里


上述代码中的
reference
变量有效还是悬空?调用代码中的引用会延长作为参数传递的临时对象的生存期吗?

这将编译,但最终会得到一个悬空引用<代码>参数在
函数
返回后被释放

  • 调用函数时引用临时匿名对象
  • 函数返回引用
  • 现在函数返回了临时参数,临时参数被释放
  • 当对象被销毁时,引用现在处于悬空状态

  • 如果您将其设置为非常量,那么它就不会编译,因为您无法将非常量引用传递给匿名对象。

    这一部分很重要

    引用绑定到的临时对象

    在这种情况下,参数绑定到临时变量,并将在调用后销毁


    您不能通过在上传递引用来进一步延长生存期。

    从C++11点开始,函数返回的引用不是临时的:

    12.12.1类类型的临时值是在各种上下文中创建的:将引用绑定到prvalue(8.5.3),返回 prvalue(6.6.3),创建prvalue(4.1、5.2.9、5.2.11、5.4)的转换,引发异常(15.1), 输入处理程序(15.3)和一些初始化(8.5)。

    返回引用的函数不返回prvalue(“纯右值”),因此它不是临时函数。 这似乎很自然:编译器无法管理引用对象的生存期,这是程序员的责任

    因此,编译器不为const int&reference提供任何liftime保证,因为它没有绑定到临时表达式。

    完整表达式是一个不是另一个表达式的子表达式的表达式。在这种情况下,包含调用
    函数(10)
    的完整表达式是赋值表达式:

    const int& reference = function( 10 );
    
    为了使用参数
    10
    调用
    函数
    ,将为临时整数对象
    10
    创建一个临时常量引用对象。临时整数和临时常量引用的生存期通过赋值扩展,因此,尽管赋值表达式有效,但尝试使用
    reference
    引用的整数是未定义的行为,因为
    reference
    不再引用活动对象

    我认为,C++11标准澄清了这种情况:

    引用绑定到的临时对象或作为引用绑定到的子对象的完整对象的临时对象在引用的生存期内持续存在,但以下情况除外:

    -在函数调用(5.2.2)中,临时绑定到引用参数的操作会一直持续到包含该调用的完整表达式完成为止


    “引用绑定到的临时…在引用的生存期内持续存在”。在这种情况下,引用的生存期结束于赋值表达式的末尾,临时整数的生存期也结束于赋值表达式的末尾。

    您不能否认他的
    引用
    绑定到了临时整数。事实上,有几个参考文献绑定到临时文件。这里的标准措辞非常糟糕。当然,其目的是延长生存期,以匹配使用实际临时变量初始化的引用。遗憾的是,这并不是标准所说的。@JamesKanze:我同意措辞不是很精确,但是,如果使用单独的编译模型,编译器不可能知道函数完成后临时文件的生存期应该在调用站点延长。编译器不可能知道返回的引用是否绑定到与参数相同的对象或任何其他对象(即
    const int&function(const int&){static int i=0;return i;}
    )此答案没有解决任何问题…并且临时值在语句末尾的分号处被销毁,不是在调用后立即执行。@PotatosWater-我没有在调用后立即执行,但临时变量的生存期取决于参数的生存期。@BoPersson参数的生存期确实在函数的末尾结束。如果你的意思是临时变量的生存期取决于参数的生存期,那是真的,但是临时变量和参数是相同的,所以它是空的。可以更清楚地说,函数调用对其参数的生存期没有影响。编辑:我不是投票人……这是C++11修正C++03含糊不清的措辞的地方,应该采取追溯性的修正。作业结束时,
    param
    不是被销毁了吗?“临时对象将被销毁,作为计算完整表达式(1.9)的最后一步,该表达式(从词汇上)包含创建临时对象的点。”
    const int& reference = function( 10 );