我想知道是否有可能找到可等待的 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)
也许有一个更简单的方法来做到这一点,但现在我没有想到任何方法。
谢谢
我想知道 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- ) 上似乎临时在初始挂起后被销毁。