C++23标准新增了std::generator,它是一个模板类,位于<generator>头文件中,利用协程机制实现了惰性求值的序列生成器。通过co_yield关键字,函数可以像Python的yield那样逐个产出值,而不必一次性构造整个容器。

什么是std::generator
std::generator是C++23提供的协程返回类型,用于表示一组按序产生的值。它自身是一个输入迭代器兼容的视图,调用方可以用范围for循环逐个获取元素。它最大的特点是惰性:只有在使用者请求下一个值时,协程才恢复执行并产出数据。
基本示例
下面代码展示如何用std::generator写出类似Python的生成器:
#include <generator>
#include <iostream>
// 生成一个从start开始的n个整数
std::generator<int> count_from(int start, int n) {
for (int i = 0; i < n; ++i) {
co_yield start + i; // 产出当前值,暂停协程
}
}
int main() {
// 像Python一样遍历生成器
for (int v : count_from(5, 3)) {
std::cout << v << " ";
}
// 输出: 5 6 7
return 0;
}
协程如何支撑生成器
std::generator的底层依赖C++20引入的协程框架。函数中使用co_yield时,编译器会将其改写为状态机:每次产出值后,协程帧保存局部状态并挂起,等待调用方推进迭代器时再恢复。
与手动迭代器对比
在没有std::generator以前,实现惰性序列需要手写迭代器类、维护状态、重载运算符,代码繁琐。协程把这些问题交给编译器处理。
| 方式 | 代码量 | 可读性 |
|---|---|---|
| 手动迭代器 | 多 | 低 |
| std::generator | 少 | 高 |
注意事项
- std::generator产出的元素是临时对象,不能返回其地址长期保存。
- 协程帧在生成器销毁时自动清理,但需保证迭代过程不超出生成器生命周期。
- 目前主流编译器如GCC 13、Clang 17已支持该特性,使用前请确认标准版本。
嵌套生成器
还可以用co_yield嵌套展开另一个生成器:
#include <generator>
#include <iostream>
std::generator<int> inner() {
co_yield 1;
co_yield 2;
}
std::generator<int> outer() {
co_yield 0;
co_yield inner(); // 展开子生成器
co_yield 3;
}
int main() {
for (int v : outer()) {
std::cout << v << " ";
}
// 输出: 0 1 2 3
}
借助std::generator,C++开发者终于可以用接近Python的简洁语法处理流式数据,既保留性能又提升开发效率。
std::generatorC++23coroutine修改时间:2026-07-26 22:21:19