我试图围绕C ++协程功能。我阅读了Kenny的文章(C++ - Introducing C++/WinRT),并尝试观看此演示文稿,CppCon 2016: James McNellis “Introduction to C++ Coroutines"。我一直看到没有某种形式的return语句的非空“函数”。作为示例,请参阅Kenny的文章中的以下代码示例。 PrintFeedAsync 函数/协同程序具有 IAsyncAction 返回类型,但定义中没有return语句。有人可以解释这是如何工作的吗?
IAsyncAction PrintFeedAsync()
{
Uri uri(L"http://kennykerr.ca/feed");
SyndicationClient client;
SyndicationFeed feed = co_await client.RetrieveFeedAsync(uri);
for (SyndicationItem item : feed.Items())
{
hstring title = item.Title().Text();
printf("%ls\n", title.c_str());
}
}
int main()
{
initialize();
PrintFeedAsync().get();
}
答案 0 :(得分:0)
对于作为协程的函数,其返回类型必须定义某些特征,描述协程如何工作。 C ++ / WinRT为其IAsyncAction
或IAsyncOperation<TResult>
版本定义了这些特征。具体来说,有两种方法可以处理来自协程的返回:return_value(...)
或return_void()
。 IAsyncOperation使用前者,IAsyncAction使用后者。
在这个答案的时候看一下最新的协程规范,我们发现如果协程函数体中没有co_return语句会发生什么:
如果
p.return_void()
是一个有效的表达式,那么离开协程的末尾就相当于没有操作数的co_return
;否则从协程的末端流出会导致不确定的行为。- "Programming Languages – C++ Extensions for Coroutines" (N4680) § 6.6.3.1/3
由于C ++ / WinRT定义了return_void for IAsyncAction's traits,编译器将遵循上述规则。在执行流出协程末尾的末尾,使用return_void方法,就像使用co_return;
结束函数一样。如果我们看一下return_void的定义,我们认为它等同于将状态设置为Completed并调用完成处理程序(如果有)。