co_return不返回状态,仅触发promise::return_void()或return_value()将结果存入promise对象,真正返回状态由awaiter的await_resume()实现,异常需在await_resume()中主动rethrow,多态错误应封装为std::expected等类型。

co_return 本身不返回状态,它只负责协程退出和结果传递
很多人以为 co_return 像普通函数 return 那样能“返回状态码”,其实不是。它本质是协程的终止指令,触发 promise_type::return_void() 或 return_value(T&&),最终把值塞进 promise 对象里——真正“返回状态”的,是你自己设计的 awaiter 或 coroutine_handle 调用方怎么取这个值。
想拿到协程执行结果,得靠 awaiter 的 await_resume()
协程函数返回的是一个可等待对象(比如 Task<int></int>),调用方 co_await 它时,await_resume() 才真正暴露结果。常见错误是直接忽略返回类型或没实现 await_resume():
- 如果协程函数声明为
Task<void> func();</void>,co_return;触发promise.return_void(),await_resume()应该返回void(或什么都不返回) - 如果声明为
Task<int> func();</int>,co_return 42;触发promise.return_value(42),对应await_resume()必须return value_;(value_ 是 promise 里存的 int) - 没实现
await_resume(),或者返回类型不匹配,编译报错:"no matching member function for call to 'await_resume'"
异常情况下的“状态”要靠 promise 的 unhandled_exception()
协程里抛异常不会被外层 catch,而是由 promise 捕获并存起来。调用方在 await_resume() 里必须主动 rethrow,否则异常就丢了:
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
-
promise.unhandled_exception()会保存std::current_exception() -
await_resume()中需检查是否异常待处理,例如:if (exc_) std::rethrow_exception(exc_);
- 漏掉这步,协程看似“成功结束”,实际异常静默吞掉,调试极难定位
别指望 co_return 返回多个值或错误码,要用结构体封装
C++ 协程不支持像 Rust 的 Result<t e></t> 那样原生带状态的返回。如果你需要区分“成功值 / 错误码 / 取消”,得自己定义返回类型:
- 推荐用
std::expected<t std::error_code></t>(C++23)或absl::StatusOr<t></t> co_return std::unexpected(std::make_error_code(std::errc::invalid_argument));- 对应 promise 的
return_value()要能接受std::expected,且await_resume()返回同类型,让调用方自己判断.has_value() - 直接用
int返回 -1 表示失败?危险——无法区分“业务错误”和“系统异常”,也丢失错误上下文
协程的“状态”不在 co_return 这一行里,而在你如何设计 promise 和 awaiter 的交互契约上;最常被跳过的,是异常传播和类型安全封装这两环。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










