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

C++协程中const引用参数绑定临时对象的行为是否为定义行为?

问题解答

这段代码属于未定义行为

原因如下:

  • 在普通函数中,const引用绑定临时对象时,临时对象的生命周期会被延长至该引用的生命周期结束,但这个规则仅适用于普通函数的局部引用场景,协程并不适用这个特例。
  • 调用coro(Obj{})时,临时Obj对象的生命周期仅持续到整个调用表达式完成——也就是tsk初始化完毕的时刻。当协程挂起并返回调用者后,这个临时对象就已经被销毁了。后续通过co_await tsk恢复协程时,coro中的const Obj& obj引用的是已销毁的对象,这直接触发未定义行为。

关于协程参数使用const引用的风险

确实,这种场景下const引用完全不适合作为协程参数:调用者很容易沿用普通函数的习惯传递临时对象,却不知道协程的挂起机制会打破原本的临时对象生命周期延长规则。如果必须使用引用类型的协程参数,调用者必须严格保证被引用实体的生命周期长于协程对象的整个生命周期(包括所有挂起、恢复阶段)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 05:39:56