2012-04-17 110 views
9

我有此代码(简化版本):绑定到函数参数的引用是否会延长该临时的生命周期?

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

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

我不能完全决定哪个程度C++ 03标准$ 12.2/5措词

临时到该参考是结合或临时的对临时绑定的子对象的完整对象的临时对象在参考的生命周期中保留...

适用于此处。

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

回答

9

A full-expression是不是另一个表达式的子表达式的表达式。在这种情况下,含有该呼叫function(10)全表达是赋值表达式:

const int& reference = function(10); 

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

的C++ 11标准,我想,澄清的情况:

到其中参考结合临时或暂时这是一个子对象的完整的对象,其参考结合仍然存在用于参考的除了寿命:

...

- 甲暂时结合到在一个函数调用(5.2.2)的参考参数持续直到包含该呼叫的全表达的完成。

编辑:“临时到的引用绑定...持续基准的寿命”。在这种情况下,引用的生命周期结束于赋值表达式的末尾,临时整数的生命周期也一样。

2

这将编译,但你最终会有一个悬而未决的参考。在function返回后,param被释放。

  1. 函数调用来临时,匿名对象
  2. 函数返回
  3. 现在函数返回临时参数是释放
  4. 参考现在晃来晃去的目的是参考参考销毁

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

+0

在作业结束时是不是'param'被销毁? “临时对象被作为评估完整表达式(1.9)的最后一步被破坏掉(词法上)包含它们被创建的点。” – 2012-04-17 15:19:00

1

正是这部分是重要

临时其中引用绑定到

在这种情况下,参数被绑定到临时的,并且该呼叫之后将被破坏。

您无法通过传递参考来延长寿命。

+1

你不能否认他的'参考'是绑定到临时的。事实上,有几个参考文献绑定到临时文件。这里的标准措辞非常糟糕。当然,这个意图是只延长到与实际临时初始化的参考相匹配。遗憾的是,这不是标准所说的。 – 2012-04-17 12:31:34

+2

@JamesKanze:我同意这个措词不是很精确,但是说到一个单独的编译模型,编译器不可能知道临时的生命周期应该在函数之后的调用位置被扩展完成。编译器不可能知道返回的引用是否与参数或任何其他对象绑定到相同的对象(即'const int&function(const int&){static int i = 0; return i;}') – 2012-04-17 13:23:42

+0

这个答案并不是' t可以解决任何问题......暂时在声明结尾处以分号销毁,而不是在紧接呼叫之后。 – Potatoswatter 2012-04-17 14:56:18

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)。

函数返回一个参考dosn't返回prvalue(“纯rvalue”),所以它不是一个临时的。 这似乎是很自然的:编译器不能管理引用对象的生命周期,这是程序员的责任

因此,编译器为const int的&参考不提供任何liftime guarantes,因为它是无界暂时的。

+0

......这是C++ 11修正了C++ 03的模棱两可的措辞的一个地方,这是一个应该采取追溯措施的修复措施。 – Potatoswatter 2012-04-17 14:58:47

相关问题