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
相关产品推荐
相关产品推荐

