C++20协程需满足三条件:含co_await、co_yield或co_return;返回类型具promise_type;编译器支持C++20。GCC≥11、Clang≥14、MSVC2019起可用-std=c++20启用。自定义generator示例实现迭代生成整数序列。

C++20 引入了原生协程支持,让异步编程更直观。要使用 C++20 协程,需满足三个关键条件:函数包含 co_await、co_yield 或 co_return 关键字;返回类型具有协程 traits(即符合协程接口);编译器开启 C++20 支持。
启用协程环境
确保你的编译器支持 C++20 协程,并在编译时启用 C++20 标准:
- GCC:使用 -std=c++20 且版本 ≥ 11
- Clang:≥ 14 版本并启用 -std=c++20
- MSVC:Visual Studio 2019 及以上,默认支持
定义协程返回类型
C++20 协程需要一个符合规范的返回类型,通常包括 promise_type。常见做法是自定义一个 task 或 generator 类型。
例如,实现一个简单的 generator 类型用于产生值:
立即学习“C++免费学习笔记(深入)”;
struct generator { struct promise_type { int current_value; suspend_always initial_suspend() { return {}; } suspend_always final_suspend() noexcept { return {}; } generator get_return_object() { return generator{this}; } void return_void() {} suspend_always yield_value(int value) { current_value = value; return {}; } void unhandled_exception() { std::terminate(); } };struct iterator {
promise_type* p;
bool done;
iterator& operator++() {
done = !co_await_handle(p);
return *this;
}
int operator*() const { return p->current_value; }
bool operator!=(std::default_sentinel_t) const { return !done; }
};
promise_type* p;
iterator begin() { return {p, false}; }
std::default_sentinel_t end() { return {}; }};
编写协程函数
使用 co_yield 返回一系列值:
generator range(int from, int to) { for (int n = from; n调用方式:
for (int i : range(1, 5)) { std::cout使用 co_await 实现异步等待
可以结合 std::suspend_always 和自定义 awaiter 实现异步操作。
struct async_op { bool await_ready() { return false; } void await_suspend(std::coroutine_handle h) { // 模拟延迟执行 std::thread([h]() { std::this_thread::sleep_for(std::chrono::seconds(1)); h.resume(); }).detach(); } void await_resume() {} };task do_something() { std::cout << "开始...\n"; co_await async_op{}; std::cout << "完成!\n"; }
注意:task 是另一个常见的协程返回类型,需自行定义或使用第三方库(如 cppcoro)简化开发。
基本上就这些。C++20 协程核心在于理解 promise_type、handle 和 awaiter 三者协作机制。虽然标准未提供通用 task/generator,但通过自定义类型可灵活实现所需行为。











