c++ 只有co_return的协程有什么用处吗在最后?

rwqw0loc  于 2023-03-20  发布在  其他
关注(0)|答案(2)|浏览(150)

我很好奇,因为我在约苏提斯的书中读到了以下内容:
如果这些关键字[co_await/co_yield/co_return]在协程中都不是必需的,那么您必须在末尾显式地编写一个co_return;语句。
这句话让我明白,原则上答案是肯定的,即它可能是有用的。
但你有这样的例子吗?
通过阅读本文,我的第一印象是,如果协程中唯一的co_*表达式是作为其最后一条语句的co_return;,那么调用这样一个协程时相对于调用结尾为return的普通void函数可能发生的所有情况都是

  • 一些代码通过co_await promise.initial_suspend();在它之前运行,
  • 经由try/catch/promise.unhandled_exception();的异常处理,
  • 通过co_await promise.final_suspend();在其之后运行的一些更多代码。

但是在协程的主体中没有发生任何事情,换句话说,协程只在开始时进入一次,在结束时退出一次,就像一个正常的函数一样;工作流协程没有提供“挂起-接着-恢复”,不是吗?无论上面的3个要点做什么,我都可以分别在调用前、调用前后和调用后将其写在适当位置。
所以,重申一下这个问题,有没有什么实际的理由让我想要一个在末尾只有一个co_return;的协程?

vojdkbi0

vojdkbi01#

假设你有一个虚基类,它定义了一个在运行时调度的虚协程:

struct Base {
    virtual promise<void> coro() = 0;
};

然后你有多个子类来实现这个协程,一些子类实际上使用了协程本身的全部特性,而另一些可能不需要,只是执行一些代码,然后在最后执行co_return
基本上,当你对不同的协程进行任何类型的动态调度,并且一些被调度的协程是“微不足道的”,那么就会出现这种情况,这不一定是虚函数,这只是一个例子。
你是对的,以独立的方式编写这样一个协程可能没有多大意义,如果它只被直接调用,那么使用标准函数会更好。

pod7payv

pod7payv2#

这并不是说co_return;在某些情况下是必须的,而是说如果这三个都不存在,你就不在协程中,你可以用一个普通的函数,返回一个从某处得到的waitable。
这可能是因为本书考虑的是特定的不可默认构造的waitables,或者在其promise的return_void中做了一些其他方法无法访问的事情。

相关问题