Skip to content

std::generator(C++23)

一句话

co_yield 惰性产生值序列的协程生成器——替代手写迭代器,零堆分配(分配器可定制),代码量减少一个数量级。

头文件

#include <generator>

核心 API 速查

操作签名说明
生成器类型template<class T> class generator惰性值序列,满足 view 概念
产值co_yield expr;产出一个值并挂起
完成生成co_return;结束生成器
迭代generator::iterator输入迭代器,用于 range-for
范围适配直接用于 ranges:: 管道生成器是 view,可组合
引用类型generator<const T&>按引用产出(避免拷贝)
分配器template<class T, class Alloc> class generator可定制协程帧分配器

最小示例

cpp
// Standard: C++23
#include <generator>
#include <iostream>

std::generator<int> fibonacci() {
    int a = 0, b = 1;
    while (true) {
        co_yield a;
        auto tmp = a;
        a = b;
        b = tmp + b;
    }
}

int main() {
    for (int v : fibonacci() | std::views::take(8)) {
        std::cout << v << " "; // 0 1 1 2 3 5 8 13
    }
}

嵌入式适用性:中

  • 惰性求值:只在需要时计算下一个值,不预分配整个序列的内存
  • 协程帧可使用自定义分配器,适合静态内存池
  • 替代手写迭代器和回调函数,代码可读性大幅提升
  • C++23 特性,编译器支持仍在推进中(GCC 14+、Clang 17+、MSVC 19.34+)
  • 生成器生命周期管理需注意:生成器销毁后访问产出值是未定义行为

编译器支持

GCCClangMSVC
141719.34

另见


部分内容参考自 cppreference.com,采用 CC-BY-SA 4.0 许可

基于 VitePress 构建