You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

临时对象生命周期延长疑问:传递给bar时为何未被二次延长?

临时对象生命周期延长的疑问

示例代码

void bar(int const & x) //#3
{
}

void foo(int const & x) //#1
{    
    bar(x); //#2
}

int main()
{
   double x = 1.0;
   foo(static_cast<int>(x)); //#0    
}

问题

在#0处通过static_cast<int>(x)创建一个prvalue并传递给foo(#1),该临时对象的生命周期被延长。随后将其传递给bar(#2),此时为何临时对象未被二次延长?且Sanitizer未报告任何问题,遗漏了什么要点?

解答

  • 生命周期延长的核心规则:C++里只有当临时对象直接绑定到引用参数/变量时,才会触发生命周期延长,延长至该引用的生命周期结束。在foo函数中,x是绑定了#0处临时对象的引用,但把x传递给bar的引用参数时,bar的引用绑定的是x指向的对象(也就是原临时对象),这不属于“临时对象直接绑定新引用”的场景,因此不会触发二次延长。
  • Sanitizer无报错的原因:原临时对象的生命周期已经被foo的引用x延长到了foo函数的整个执行周期内。bar的调用是在foo内部执行的,此时临时对象仍然处于存活状态,对它的访问完全合法,不存在悬空引用问题,所以Sanitizer不会检测到错误。

内容的提问来源于stack exchange,提问作者getsoubl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 15:32:04