CodeWalk

C++20 co_return与Task类型设计

作者:专业代码师 · 2026-05-30 12:55

请说明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则延迟执行。