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

co_await promise.initial_suspend()是否在try-catch中执行?C++标准确认

co_await promise.initial_suspend() 是否在try-catch块中执行?

两种协程翻译形式对比

形式一(initial_suspend 位于 try 块内)

{
    promise-type promise promise-constructor-arguments ;
    try {
        co_await promise.initial_suspend() ;
        function-body
    } catch ( ... ) {
        if (!initial-await-resume-called)
            throw ;
        promise.unhandled_exception() ;
    }
final-suspend :
    co_await promise.final_suspend() ;
}

形式二(initial_suspend 位于 try 块外)

{
   P p;
   co_await p.initial_suspend(); // initial suspend point
   try { F } catch(...) { p .unhandled_exception(); }
final_suspend :
   co_await p.final_suspend(); // final suspend point
}

标准合规性说明

符合C20及C23标准的是形式一。

根据C++标准中对协程的定义,co_await promise.initial_suspend()的执行被包裹在try块中,但存在特殊的异常处理逻辑:如果该表达式抛出异常且协程尚未从initial_suspend的挂起状态恢复(即initial-await-resume-called为false),会直接重新抛出异常,不会调用promise.unhandled_exception()。这是因为initial_suspend属于协程的启动阶段,此时函数体还未开始执行,该阶段的异常属于启动错误,不应由promise的异常处理机制接管。

形式二来自C协程提案的早期版本,并非最终纳入C20标准的规范内容,因此不符合现行C20/C23标准。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 06:11:02