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

C++临时对象生命周期扩展:含函数调用的完整表达式判定

结论

你的判断完全正确,给出的std::copy_if调用代码是安全的,不会触发悬空引用问题。

规则细节说明

C++标准对绑定到const引用的临时对象生命周期边界有明确规定:

  • 临时对象绑定到函数(包括构造函数)的引用形参时,生命周期仅持续到包含本次函数调用的完整表达式结束,不会因为该引用后续被存储为类的成员变量,就自动延长临时对象的存活时间。
  • 你给出的错误示例中,MyIterator it = {myContainer, {stuff1, stuff2, stuff3}};本身就是一个独立的完整表达式,初始化列表生成的临时std::vector<Stuff>在这行语句末尾的分号位置就会被销毁,之后it内部存储的stuffVector引用自然成为悬空引用,完全符合规则描述。
  • 回到std::copy_if的调用场景,包含MyIterator构造动作的完整表达式是整个std::copy_if(...)调用语句。临时vector从构造完成开始,会一直存活到std::copy_if执行完所有遍历逻辑、函数返回之后才会被销毁,完全覆盖了迭代器在算法内部被解引用、递增等所有使用场景,因此内部持有的引用始终有效。
关键边界澄清

生命周期扩展不存在链式传递效果。临时对象的销毁时机只由它第一次被绑定的引用场景决定,后续不管有多少层其他引用(包括类的引用成员)指向这个临时对象,都不会改变它的生命周期长度。

只有当临时对象直接绑定到一个作用域内的局部引用变量时,它的生命周期才会延长到和该局部变量一致;凡是绑定到函数形参的临时对象,寿命永远截止到外层完整表达式结束,不会有额外延长。
你给出的copy_if场景刚好落在规则的安全区间内:临时对象的存活范围完全覆盖了它被访问的全部代码路径,因此代码行为是符合C++标准、完全可预期的。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 18:57:49