协程的每个执行路径上是否有必要有一个返回void的co_return语句

ack*_*ckh 2 c++ coroutine c++-winrt c++-coroutine

我想知道下面的代码是否是有效的 C++ 代码,或者如果不使用co_return会导致未定义的行为。

IAsyncAction MyClass::MyCoroutine()
{
  co_await someOtherClassInstance.SomeCoroutine();
}
Run Code Online (Sandbox Code Playgroud)

即是否需要将代码调整如下?

IAsyncAction MyClass::MyCoroutine()
{
  co_await someOtherClassInstance.SomeCoroutine();
  co_return;
}
Run Code Online (Sandbox Code Playgroud)

如果行为不是未定义的,那么最佳实践是什么(总是添加co_return或不添加)以及这样做的理由是什么?

IIn*_*ble 5

省略该co_return;语句在这里得到了明确的定义。根据[stmt.return.coroutine],只要p.return_void()是有效的表达式(其中p是承诺类型),就允许这样做。

C++/WinRT 实现了return_void()and IAsyncActionIAsyncActionWithProgress或者更确切地说是这些的内部等待适配器结构)。

由于该co_return;声明在这里纯粹是可选的,因此是否使用它取决于个人喜好。就我个人而言,我更喜欢阅读co_return;存在该语句的代码,原因如下:

  • 它允许我轻松注释掉协程的一部分(例如用于测试),而无需冒险将其变成常规函数。
  • 我不必了解复杂的 C++/WinRT 库的复杂性即可确定代码是否正确。
  • 如果我决定更改其返回类型,代码将保持正确。