通过引用临时传递函数的生命周期

Lifetime of temporary passed through function by reference

本文关键字:生命 周期 传递函数 引用      更新时间:2023-10-16

我可以这样做:

const int &i = 5;

,并将临时的生存期延长为i的生存期。

const int &fun (const int &i){
    return i;
}
int main () {
    const int &r = fun(5);
    // Can I use r here?
}

代理-5的生存期是否还在延长?或者r是一个悬空引用?

这是一个悬空引用。从[class.temporary]/4 - 5:

在两种上下文中,临时变量在fulexpression末尾的不同位置被销毁。第一个上下文是调用默认构造函数[…])

第二个上下文是当引用绑定到临时对象时。引用所指向的临时对象绑定的或临时的,它是引用被绑定到的子对象的完整对象在引用的生命周期内,除了:

  • 在构造函数的参数初始化式[…]
  • 中临时绑定到引用成员
  • 在函数调用(5.2.2)中,对引用形参的临时绑定将保持,直到完成包含调用的完整表达式。
  • […]

5一直持续到包含调用的完整表达式完成,也就是说:

const int &r = fun(5);
// <== no more 5

不,我不这么认为。你把5绑定到参考上,这是fun的参数,所以它持续的时间和那个参数持续的时间一样长。该参数只在调用fun期间有效。

上一个问题探讨了相关的标准文本