我很好奇,因为我在约苏提斯的书中读到了以下内容:
如果这些关键字[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;
的协程?
2条答案
按热度按时间vojdkbi01#
假设你有一个虚基类,它定义了一个在运行时调度的虚协程:
然后你有多个子类来实现这个协程,一些子类实际上使用了协程本身的全部特性,而另一些可能不需要,只是执行一些代码,然后在最后执行
co_return
。基本上,当你对不同的协程进行任何类型的动态调度,并且一些被调度的协程是“微不足道的”,那么就会出现这种情况,这不一定是虚函数,这只是一个例子。
你是对的,以独立的方式编写这样一个协程可能没有多大意义,如果它只被直接调用,那么使用标准函数会更好。
pod7payv2#
这并不是说
co_return;
在某些情况下是必须的,而是说如果这三个都不存在,你就不在协程中,你可以用一个普通的函数,返回一个从某处得到的waitable。这可能是因为本书考虑的是特定的不可默认构造的waitables,或者在其promise的return_void中做了一些其他方法无法访问的事情。