gpt4 book ai didi

c++ - Visual Studio 2015 Update 3 中的 co_await 是否与 std::experimental::optional 一起使用

转载 作者:行者123 更新时间:2023-11-28 02:02:01 25 4
gpt4 key购买 nike

网上有一些链接 [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();
}

错误是:

Error (active) this co_await expression requires a suitable "await_ready" function and none was found

所以我的问题是我做错了什么,是库缺少对 await 的支持,还是编译器缺少对 co_await 这方面的支持。

最佳答案

there are some links on the internet [1,2] suggesting that co_await should work with std::experimental::optional

您对这些链接的解释不正确。虽然不可否认this one is essentially designed造成这种误解。

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

人们发现了一种 ab 使用co_await 来执行等效于条件返回的方法。您可以使用 co_await,当应用于 optional 时,检查 optional 的状态,如果它为空则简单地退出该函数。实际上,co_await 会说暂停该函数(从而将控制权返回给调用者),但从不安排它的恢复。这产生了返回的效果(包括清理协同程序)而无需实际编写 if(opt.empty()) return;否则...。这也允许 co_awaitoptional 中解压值(如果其中存储了一个值)。

然而,这并不仅仅因为 optional 的存在而神奇地发生。您必须构建特殊的 co_await 机制,该机制与作为 co_await 表达式类型的 optional 以及它所使用的函数的返回值类型一起工作内。

co_await 的 VS2015 实现为 std::future 上的 co_await 提供了这种机制。但它不支持 optional 或其他随机类型。您必须自己构建它,您引用的所有帖子都没有指出这一点。

关于c++ - Visual Studio 2015 Update 3 中的 co_await 是否与 std::experimental::optional 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39069484/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com