

新闻资讯
技术学院co_await、co_yield、co_return是C++20协程的三大关键字,本质为编译器生成状态机的语法糖,其行为由promise type和awaitable类型共同决定。
这三个关键字是 C++20 协程的核心语法糖,它们本身不实现协程逻辑,而是编译器用来生成状态机代码的“钩子”。真正决定协程行为的是你提供的 promise type 和 awaitable 类型。
它把当前协程暂停,保存执行点(即栈帧局部状态),然后调用 awaitable 对象的 await_ready()、await_suspend() 和 await_resume() 三个成员函数。常见用法:
task 或 std::experimental::suspend_always)asio::awaitable、std::generator 的迭代)co_await
普通值或函数调用;必须返回满足 awaitable 概念的对象本质是 co_await promise.yield_value(value) 的语法糖。它让协程产出一个值后挂起,下次恢复时从下一行继续执行。典型场景是实现惰性序列:
std::generator 或自定义生成器类型generator.next() 触发一次 co_yield 后的恢复yield_value(T&&) 成员,并返回一个 awaitable它不是简单地 return;而是触发 promise 的清理和结果传递流程:
co_return expr; 等价于 promise.return_value(expr); goto final_suspend;
co_return;(无表达式)等价于 promise.return_void(); goto final_suspend;
promise.unhandled_exception();
promise.final_suspend() 返回的 awaitable,决定是否销毁协程帧不复杂但容易忽略:没有 promise type,这三个关键字无法编译;没有合适的 awaitable,co_await 就会报错;而 co_yield 和 co_return 的行为完全由 promise 的对应成员函数定义。