如何使用C语言中的20 co_yield关键字实现协程生成器?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1030个文字,预计阅读时间需要5分钟。
直接说结论:
为什么 co_yield 单独写就编译不过
常见错误是这样写:
int fibonacci() { int a = 0, b = 1; while (true) { co_yield a; // ❌ 编译报错:'co_yield' cannot be used in a non-coroutine function int tmp = a; a = b; b += tmp; } }
原因很直接:co_yield 只能在协程函数里用,而协程函数的判定规则是:
- 函数体中至少出现一次
co_yield、co_await或co_return - 返回类型必须定义嵌套的
promise_type,且该类型满足协程 traits(如提供get_return_object、initial_suspend等) - 返回类型不能是
int、void、std::vector<T>这类“普通”类型
换句话说,co_yield 不是语法糖,它是协程状态机的触发器,没有配套的 promise 和 handle,它连编译都过不了。
本文共计1030个文字,预计阅读时间需要5分钟。
直接说结论:
为什么 co_yield 单独写就编译不过
常见错误是这样写:
int fibonacci() { int a = 0, b = 1; while (true) { co_yield a; // ❌ 编译报错:'co_yield' cannot be used in a non-coroutine function int tmp = a; a = b; b += tmp; } }
原因很直接:co_yield 只能在协程函数里用,而协程函数的判定规则是:
- 函数体中至少出现一次
co_yield、co_await或co_return - 返回类型必须定义嵌套的
promise_type,且该类型满足协程 traits(如提供get_return_object、initial_suspend等) - 返回类型不能是
int、void、std::vector<T>这类“普通”类型
换句话说,co_yield 不是语法糖,它是协程状态机的触发器,没有配套的 promise 和 handle,它连编译都过不了。

