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

时间:2012-04-17 11:51:21

标签: c++ reference object-lifetime function-parameter

我有这段代码(简化版):

const int& function( const int& param )
{
     return param;
}

const int& reference = function( 10 );
//use reference

我无法确定C ++ 03 Standard $ 12.2 / 5措辞的程度

  

引用绑定的临时对象或作为临时绑定的子对象的完整对象的临时对象在引用的生命周期内仍然存在...

适用于此。

以上代码中的reference变量是有效还是悬空?调用代码中的引用是否会延长作为参数传递的临时值的生命周期?

4 个答案:

答案 0 :(得分:10)

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

const int& reference = function( 10 );

为了使用参数function调用10,将为临时整数对象10创建临时const引用对象。临时整数的生命周期和临时const-reference通过赋值扩展,因此虽然赋值表达式有效,但尝试使用reference引用的整数是未定义的行为,reference不再引用活物。

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

  

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

     

...

     

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

“引用绑定的临时值......在引用的生命周期内持续存在”。在这种情况下,引用的生命周期在赋值表达式的末尾结束,临时整数的生存期也是如此。

答案 1 :(得分:2)

这将编译,但你最终会有一个悬空参考。 param返回后释放function

  1. 函数通过引用临时匿名对象
  2. 来调用
  3. 函数返回引用
  4. 现在该函数已经返回临时参数被释放
  5. 当对象被销毁时,引用现在悬空
  6. 如果你把它设为非const,那么它就不会被编译,因为你不能将非const引用传递给匿名对象。

答案 2 :(得分:2)

从C ++ 11 viepoint中,函数返回的引用是而不是临时:

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(“纯rvalue”),因此它不是临时的。 这似乎很自然:编译器无法管理引用对象的生命周期,这是程序员的责任

因此,编译器不为const int&提供任何生命周期保证。参考,因为它不是临时的。

答案 3 :(得分:1)

这部分很重要

  

引用绑定的临时值

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

您无法通过传递参考来进一步延长使用寿命。