Visual Studio 2015 Update 3中的co_await是否适用于std :: experimental :: optional

时间:2016-08-21 22:42:20

标签: c++ visual-studio-2015 async-await

互联网上有一些链接 [12]建议co_await应该与std::experimental::optional一起使用,并且VS 2015 Update 2应该支持这一点。 由于VS在Update 3中没有可选项,因此我使用了github中的一个,但是这样的代码无法编译:

optional<string> get_hope() {
    if ((rand() % 4) == 0)
        return nullopt;
    return "yolo";
}

optional<string> bla() {
    string s = co_await get_hope();
}

错误是:

  

错误(活动)此co_await表达式需要合适的   &#34; await_ready&#34;功能,没有找到

所以我的问题是我做错了什么,库是否缺少对等待的支持,或者编译器是否缺少对co_await这方面的支持。

1 个答案:

答案 0 :(得分:2)

  

互联网上有一些链接[1,2]表明co_await应该与std :: experimental :: optional一起使用

您错误地解释了这些链接。虽然不可否认this one is essentially designed造成了这种误解。

P0057 "coroutines"本质上是一种函数暂停其执行的方式,并在稍后的某个时间从暂停点继续。导致此问题的机制涉及函数的返回类型/签名与co_await表达式的类型之间的一系列复杂交互。

人们发现了一种方法 ab 使用co_await来执行条件返回的有效等价物。您可以将co_await应用于optional,检查optional的状态,如果该项为空则退出该功能。实际上,co_await会说暂停该函数(从而将控制返回给调用者),但从不安排其恢复。这会产生返回的效果(包括清理协程)而不实际写if(opt.empty()) return; else ...。如果值存储在co_await中,这也允许optional解包值。

然而,由于optional存在,这并不神奇。您必须构建特殊的co_await机制,它同时使用optional作为co_await表达式类型,以及它所使用的函数的返回值类型。

co_await的VS2015实施为co_await std::future提供了此机制。但它没有optional或其他随机类型的支持。你必须自己构建它,你引用的帖子都没有指出。