互联网上有一些链接 [1,2]建议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
这方面的支持。
答案 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
或其他随机类型的支持。你必须自己构建它,你引用的帖子都没有指出。