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

C++协程final_suspend的awaiter实际规则及标准依据问询

C++协程final_suspend行为的标准依据探究

在C++协程中,promise类型的final_suspend成员函数可返回任意可等待类型,常见的是std::suspend_always(将协程销毁责任交由外部)或std::suspend_never(自动销毁协程)。后者属于特例——通常不允许恢复处于最终挂起点的协程,但测试发现该特殊行为的应用并不统一。

问题核心在于,可等待对象的await_suspend成员函数有三种返回类型:

  • 返回void时,协程保持挂起;
  • 返回bool时,false恢复协程,true保持挂起;
  • 返回std::coroutine_handle时,恢复该句柄指向的协程。

针对final_suspend的返回值,在await_ready始终返回false的可等待对象下,MSVC、Clang、GCC的行为一致:

  1. 若final_suspend().await_suspend(handle)返回void,协程如预期保持在最终挂起点;
  2. 若返回bool(true),协程同样保持在最终挂起点;
  3. 若返回bool(false),协程会被自动销毁(可通过promise类型的析构函数执行观察到),这与std::suspend_never的行为一致,说明该决策可在运行时确定。值得注意的是,销毁前会调用await_resume,尽管其结果会被丢弃;
  4. 若返回另一个协程的句柄,该协程会被恢复,当前协程保持在最终挂起点;
  5. 若返回传入的同一句柄,程序会崩溃!

其中结果1、2、4符合预期,结果3和5最引人关注:从某种角度看,两者都试图恢复已完成的协程,但仅结果3得到自动销毁的特殊处理。这使得返回协程句柄时的运行时决策较为繁琐——需手动销毁协程后返回无操作句柄,比返回false实现相同效果更复杂,甚至因需返回类型擦除的句柄导致部分用例无法实现。

现需明确:这些具体行为在C++标准中何处有描述或规定?查阅后发现标准对协程行为的描述十分简略,final_suspend的可等待对象的特殊行为似乎未被充分记录。仅能找到final_suspend及其可等待对象的使用必须noexcept(“不得潜在抛出异常”)的规定,除此之外未发现其他特殊规则。遗漏了哪个章节?为何返回传入的同一句柄与返回false的行为不同?


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 22:22:16