0

我正在尝试围绕 C++ 协程功能展开思考。我阅读了 Kenny 的文章 ( C++ - Introducing C++/WinRT ) 并尝试观看此演示文稿,CppCon 2016:James McNellis “C++ 协程简介”。我一直看到没有某种形式的 return 语句的非 void“函数”。作为一个例子,请参阅 Kenny 文章中的以下代码示例。PrintFeedAsync函数/协程具有IAsyncAction返回类型,但定义中没有返回语句。有人能解释一下这是如何工作的吗?

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();
}
4

1 回答 1

0

对于要成为协程的函数,它的返回类型必须定义某些描述协程如何工作的特征。IAsyncActionC++/WinRT 为它们的或版本定义了这些特征IAsyncOperation<TResult>。具体来说,有两种处理协程返回的方法:return_value(...)return_void(). IAsyncOperation 使用前者,IAsyncAction 使用后者。

查看此答案时的最新协程规范,我们发现如果协程函数的主体中没有 co_return 语句会发生什么:

ifp.return_void()是一个有效的表达式,从协程的末尾流出相当于co_return没有操作数的 a;否则,从协程的末尾流出会导致未定义的行为。

“编程语言 – 协程的 C++ 扩展” (N4680) § 6.6.3.1/3

由于 C++/WinRT为 IAsyncAction 的特征定义了 return_void,因此编译器将遵循上述规则。在执行从协程的末尾流出的末尾,使用 return_void 方法,就像你用 . 结束函数一样co_return;。如果我们查看 return_void 的定义,我们会发现它相当于将状态设置为 Completed,如果有,则调用完成处理程序。

于 2017-11-18T00:52:56.883 回答