std::generator在c++23中未标准化,不存在于任何正式标准库;它仅见于实验性实现(如msvc的std::experimental::generator)、第三方库(如cppcoro)或术语误用。

std::generator 不是标准库组件,别直接 #include
截至 C++23 标准,std::generator 并不存在 —— 它既不是 ISO C++ 标准的一部分,也没有被任何主流编译器(GCC、Clang、MSVC)以 std:: 命名空间提供。你在网上看到的 std::generator 示例,大概率来自:
• 某些实验性提案(如 P2471R0 的早期草稿)
• 第三方库(如 cppcoro、libunifex)的自定义类型
• 编译器私有扩展(如 MSVC 的 generator 类型,但不在 std 命名空间)
• 博客或教程的虚构/误写
想用协程生成器?得自己写或选对第三方库
C++20 引入了协程基础(co_await、co_yield、co_return),但不提供现成生成器类。要实现类似 Python yield 的行为,必须手动定义协程返回类型(即“promise type”)。常见做法有:
- 用
cppcoro::generator<t></t>(需 cppcoro 库,头文件方式集成) - 用
unifex::generator<t></t>(libunifex,更现代但依赖较大) - 手写 minimal generator:定义
class generator+promise_type+iterator,处理co_yield、销毁、移动语义等细节
例如 cppcoro 的典型用法:
cppcoro::generator<int> range(int from, int to) {
for (int i = from; i
<h3>为什么不能直接用 co_yield 写函数返回 auto?</h3>
<p>协程函数不能简单返回 <code>auto</code> 或 <code>void</code> 并用 <code>co_yield</code> —— 编译器需要知道如何构造 promise 对象和最终返回值类型。错误写法:</p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill5502" title="C++ Code Review Master"><img
src="https://img.php.cn/upload/skill/000/000/081/179051228971575.jpg" alt="C++ Code Review Master" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill5502" title="C++ Code Review Master" class="overflowclass">C++ Code Review Master</a>
<p class="overflowclass">组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。</p>
</div>
<a rel="nofollow" href="/xiazai/skill5502" title="C++ Code Review Master" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div>
<pre class="brush:php;toolbar:false;">auto bad_generator() {
co_yield 42; // ❌ error: 'co_yield' cannot be used in a function that does not return a coroutine type
}
关键点:
-
co_yield只能在返回类型满足 “可等待类型”(即含嵌套promise_type)的函数中使用 - 该返回类型必须实现
get_return_object()、initial_suspend()、final_suspend()、unhandled_exception()等接口 - 没有这些,编译器连 promise 实例都创建不出来,更别说保存 yield 值或恢复执行
MSVC 的 generator 是特例,但不跨平台
MSVC 19.3x+ 提供了 std::experimental::generator(注意是 std::experimental,非 std::),需开启 /std:c++20 和 #include <experimental></experimental>。但它:
- 仅限 Windows + MSVC,Clang/GCC 无法编译
- 属于实验性特性,API 可能变更,不建议用于生产
- 仍需链接 vcruntime,且对异常传播、多线程调用支持有限
示例(MSVC only):
#include <experimental>
std::experimental::generator<int> count_up() {
for (int i = 0; ; ++i) co_yield i;
}</int></experimental>
真正跨平台、可维护的做法,是明确选用 cppcoro 或 libunifex,并接受它们带来的构建依赖;想零依赖就得手写 generator,但要注意 suspend/resume 生命周期管理——尤其当生成器对象被移动或提前析构时,底层协程帧可能泄漏或 double-free。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










