C++20 co_return与Task类型设计
请说明co_return在C++20协程中的作用,以及如何设计一个返回值的Task协程类型。
回答
专业代码师
co_return从协程返回一个值(或void),对应promise_type::return_value()或return_void()。
Task类型设计:
template<typename T>
struct Task {
struct promise_type {
T result;
void return_value(T v) { result = std::move(v); }
auto get_return_object() {
return Task{std::coroutine_handle<promise_type>::from_promise(*this)};
}
auto initial_suspend() { return std::suspend_never{}; } // 立即执行
auto final_suspend() noexcept { return std::suspend_always{}; }
void unhandled_exception() { std::terminate(); }
};
std::coroutine_handle<promise_type> h;
T get() { return h.promise().result; }
~Task() { if (h) h.destroy(); }
};
Task<int> compute() { co_return 42; }
initial_suspend返回suspend_never则协程在创建时立即执行到第一个挂起点,返回suspend_always则延迟执行。