小编Vic*_*kel的帖子

C++ 查找 co_await 等待结果类型

我想知道是否有可能找到可等待的 co_await 的结果类型:因为不可能在未评估的上下文中使用 co_await,我不能做

template<class Awaitable>
task<> f(Awaitable&& awaitable)
{
  using result_type = decltype(co_await awaitable);
}
Run Code Online (Sandbox Code Playgroud)

有什么办法可以做到吗?

这里的主要目的是确定result_type是否为void,这里基本上是我们所拥有的:我们想要fire_and_forget一个任务,并在完成时调用一个方法,但由于void返回类型,这并不容易

template<class Awaitable, class Success, class Failure >
detail::fire_and_forget_task call_async_then(Awaitable awaitable, Success success, Failure failure)
{
  try
  {
    using result_type = ??
    if constexpr (std::is_same_v<void, result_t>)
    {
      co_await awaitable;
      success();
    }
    else
      success(co_await f);
  }
  catch(...)
  {
    failure(std::current_exception());
  }
}
Run Code Online (Sandbox Code Playgroud)

也许有一个更简单的方法来做到这一点,但现在我没有想到任何方法。

谢谢

c++ c++20 c++-coroutine

7
推荐指数
1
解决办法
483
查看次数

c ++ co_await 表达式中的临时协程

我想知道 co_await 一个通过引用临时捕获的协程是否有效。那么下面的代码是否有效,我想编译器应该将临时变量放在协程框架中,就像局部变量一样:

task g(const S&);

task f() {
    co_await g(S{});
}
Run Code Online (Sandbox Code Playgroud)

在 clang 和 msvc ( https://godbolt.org/z/HqHae8 ) 上,恢复 g 后临时似乎被破坏了,无论是在 gcc ( https://godbolt.org/z/hFWvU- ) 上似乎临时在初始挂起后被销毁。

c++ c++20 c++-coroutine

3
推荐指数
1
解决办法
137
查看次数

标签 统计

c++ ×2

c++-coroutine ×2

c++20 ×2