我想知道下面的代码是否是有效的C++代码,或者如果不使用co_return
会导致未定义的行为。
IAsyncAction MyClass::MyCoroutine()
{
co_await someOtherClassInstance.SomeCoroutine();
}
即是否需要调整代码如下?
IAsyncAction MyClass::MyCoroutine()
{
co_await someOtherClassInstance.SomeCoroutine();
co_return;
}
如果行为不是未定义的,最佳实践是什么(始终添加co_return
或不添加)?这样做的理由是什么?
2条答案
按热度按时间bkkx9g8r1#
省略
co_return;
语句在这里定义得很好。根据[stmt.return.coroutine],只要p.return_void()
是一个有效的表达式(其中p
是承诺类型),这是允许的。C++/WinRT为
IAsyncAction
和IAsyncActionWithProgress
实现了return_void()
(或者更确切地说,为它们实现了内部await适配器结构)。由于
co_return;
语句在这里是完全可选的,所以是否使用它取决于个人偏好。个人而言,我更喜欢阅读存在co_return;
语句的代码,原因如下:fkaflof62#
根据cppreference,如果Promise类型没有
Promise::return_void()
成员函数,则第一个块仅在未定义的行为中发生:当协程到达
co_return
语句时,它执行以下操作:promise.return_void()
co_return;
co_return expr
,其中expr
的类型为void*从返回空的协程的末尾落下。在这种情况下,如果Promise类型没有
Promise::return_void()
**成员函数,则该行为未定义。标准草案似乎也是这么说的:
**如果
p.return_void()
是一个有效的表达式,流出协程的函数体的结尾等价于没有操作数的co_return
;**否则流出协程函数体的末尾会导致未定义的行为。[在两个引号中强调我的]