【问题标题】:Is it possible to co_await in a catch clause?是否可以在 catch 子句中 co_await ?
【发布时间】:2019-09-03 06:03:58
【问题描述】:

以下代码:

try {
  throw 42;
} catch (int i) {
  co_await somefuture;
}

使用 clang 6 和 7 编译 -fcoroutines-ts。但是,它不能与 Visual C++ 15 (2017) Visual C++ 16 (2019) 一起编译,并出现 /await 错误

C2304: 'co_await' 不能在 catch 块内使用

C++20 标准草案和cppreference 似乎没有提及任何内容。

这是 Microsoft 编译器中缺少的功能还是我误解了标准?

【问题讨论】:

  • 你应该试试 VS 2019
  • 请提供MCVE
  • 2017 年的协程版本是标准草案中某些内容的灵感来源,它先于它。
  • 刚刚用VS 2019 Preview 1测试过,错误是一样的。我可以尝试提供一个 MVCE,但由于 C++ 协程不能开箱即用,它会依赖于诸如 cppcoro 之类的东西。
  • @Philippe 它会让拥有适当工具链的人更容易为您提供帮助,而无需为他人做出任何改变:)

标签: c++ c++20 c++-coroutine


【解决方案1】:

来自[expr.await],强调我的:

await-expression 只能出现在 function-bodycompound-statement 内的潜在评估表达式中 handler 之外( [除外])

MSVC 拒绝是正确的。

【讨论】:

  • 嗯,这是否意味着我们不能编写包含 co_await 的 lambda?
  • 我认为包含 co_await 的 lambda 很好,即使您在 catch 子句中创建 lambda。但是,虽然您可以在那里调用 lambda,但不能 co_await 其结果。
猜你喜欢
  • 2011-08-12
  • 1970-01-01
  • 2014-12-22
  • 1970-01-01
  • 2016-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-05
相关资源
最近更新 更多