协程具有初始挂起点和最终挂起点。 Acoroutine_handle
is done https://en.cppreference.com/w/cpp/coroutine/coroutine_handle/done当它在最终暂停点暂停时。然而,这种暂停是通过co_await promise.final_suspend()
。这个函数可以返回std::never_suspend
或类似的等待。
那么...然后会发生什么呢?coroutine_handle::resume
如果协程在最后一个暂停点暂停,则会产生 UB,但是如果您past最后的暂停点?
据推测,协程不被视为暂停,因此resume根据该规则是 UB https://en.cppreference.com/w/cpp/coroutine/coroutine_handle/resume。但是,您可以使用超过最终挂起点的协程句柄做什么呢?
或者说,拥有你的东西根本没有任何意义final_suspend
返回除std::suspend_always
?
协程函数是通过对协程主体的转换来定义的。协程主体完成并退出后(通过co_return
或者跑出块的末尾),会发生以下代码:
co_await p.final_suspend();
//destruct promise p
//destruct parameters in coroutine frame
//destroy coroutine state
Where p
是协程的 Promise 对象。因此,如果final_suspend
不会导致暂停co_await
,promise 被销毁,接下来是协程框架的参数,最后是协程状态对象本身。
coroutine_handle
引用协程状态。如果它已被销毁,则该句柄不会引用挂起的协程(因为有no协程)。和resume
因此将会有未定义的行为。done
如果句柄未挂起(因为它不是句柄),则类似地具有 UB。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)