Coroutine final_suspend未定义行为解析及场景问询
关于C++协程final_suspend未定义行为的疑问
若协程因未捕获异常终止,会执行以下操作:
- 捕获异常并在catch块中调用promise.unhandled_exception()
- 调用promise.final_suspend()并co_await其结果(例如恢复续体或发布结果)。从此点恢复协程属于未定义行为。
(参考cppreference中C++协程相关章节)
我对上述第二点存在困惑:文中提到final_suspend可用于恢复续体,却又指出从此点恢复协程属于未定义行为,这看似矛盾。现明确以下场景是否属于未定义行为:
- 在final_suspend的函数体内直接或间接调用coroutine_handle的
resume()? - 在final awaiter的await_suspend函数体内直接或间接恢复coroutine_handle?
- 从final awaiter的await_suspend返回coroutine_handle?
若上述某一或全部场景属于未定义行为,该规则是否仅适用于unhandled_exception后的final_suspend,还是同样适用于return_void或return_value后的final_suspend?
我已针对场景3编写了示例代码,请问该示例中的异常与续体处理是否存在未定义行为?
内容的提问来源于stack exchange,提问作者Wutz
相关产品推荐
相关产品推荐

