无回报声明的非空虚协程

时间:2017-09-13 07:35:28

标签: visual-c++ windows-runtime c++-winrt c++-coroutine

我试图围绕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();
}

1 个答案:

答案 0 :(得分:0)

对于作为协程的函数,其返回类型必须定义某些特征,描述协程如何工作。 C ++ / WinRT为其IAsyncActionIAsyncOperation<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并调用完成处理程序(如果有)。