c++oding="utf-8" ?>
std::generator 在 c++23 中尚未标准化,不存在于任何正式标准库中;它仅见于实验性实现、第三方库或术语误用,c++23 仅提供协程底层原语(如 co_yield、std::coroutine_handle),而高层 generator 封装仍处于提案阶段(如 p2796r0)。

std::generator 在 C++23 中尚未标准化 —— 它根本不存在于当前任何正式发布的标准库中。
你看到的 std::generator 很可能来自某个实验性实现(如 libc++ 的 std::experimental::generator)、第三方库(如 cppcoro、Boost.Couroutine2),或是误将 C# / Python 的语法投射到了 C++ 上。
为什么编译器报错:‘generator’ is not a member of ‘std’
这是最典型的信号:你的标准库不支持该类型。C++23 标准文档(ISO/IEC 14882:2023)中没有定义 std::generator,也没有将其纳入 <generator></generator> 或其他头文件。
- C++23 确实引入了协程核心机制(
co_await、co_yield、co_return和std::coroutine_handle),但不提供高层迭代器封装 - MSVC、GCC、Clang 当前(截至 2024 年中)均未在
std::命名空间下实现generator - 某些教程或博客用“C++23 generator”指代“用 C++23 协程手写的 generator 类”,属于术语误用
如何手写一个最小可用的 generator 类(基于 C++23 协程)
如果你需要类似 Python yield 的行为,必须自己定义协程返回类型,并实现 promise_type 和迭代器逻辑。关键不是“怎么用 std::generator”,而是“怎么让 co_yield 可被 for-range 遍历”。
以下是一个精简可运行的骨架(需启用 -std=c++23 -fcoroutines):
template<typename t>
class generator {
struct promise_type;
using handle_type = std::coroutine_handle<promise_type><p>public:
class iterator {
handle<em>type h</em>;
public:
bool operator!=(const iterator&) const { return h<em> && !h</em>.done(); }
T operator<em>() const { return h_.promise().current<em>value; }
iterator& operator++() { h</em>.resume(); return </em>this; }
};</p><p>struct promise_type {
T current_value;
generator get_return_object() { return generator{handle_type::from_promise(*this)}; }
std::suspend_always initial_suspend() { return {}; }
std::suspend_always final_suspend() noexcept { return {}; }
void return_void() {}
std::suspend_always yield_value(T v) {
current_value = v;
return {};
}
};</p><p>private:
handle<em>type h</em>;
public:
generator(handle<em>type h) : h</em>(h) {}
generator(generator&& g) : h<em>(std::exchange(g.h</em>, {})) {}
~generator() { if (h<em>) h</em>.destroy(); }
iterator begin() { if (h<em>) h</em>.resume(); return iterator{h_}; }
iterator end() { return iterator{}; }
};</p></promise_type></typename>
使用时:
generator<int> range(int n) {
for (int i = 0; i for (int x : range(5))
std::cout <h3>实际项目中更推荐用现成的成熟库</h3>
<p>自己维护协程 promise 和迭代器极易出错(比如忘记 <code>destroy()</code>、悬挂 handle、异常传播遗漏)。生产环境建议直接集成经过充分测试的实现:</p>
<ul>
<li>
<code>cppcoro::generator<t></t></code>(需 <code>#include <cppcoro></cppcoro></code>,注意其 <code>begin()/end()</code> 不是 lazy —— 构造时即启动协程)</li>
<li>
<code>boost::asio::experimental::channel<t></t></code> 或 <code>boost::stackless::generator</code>(Boost 1.83+)</li>
<li>若仅需简单序列生成,优先考虑 <code>std::ranges::iota_view</code> + 自定义 adaptor,避免协程开销</li>
</ul>
<p>例如:<code>std::ranges::iota_view{0, 10} | std::views::transform([](int i){return i*i;})</code> 比等价的协程 generator 更轻量、更易优化。</p>
<p>真正麻烦的从来不是写出一个能跑的 generator,而是确保它在异常路径下不泄漏、不崩溃、与移动语义兼容、且能在不同编译器上行为一致。别被“C++23 支持协程”误导 —— 底层原语有了,但 <code>std::generator</code> 还在提案阶段(P2796R0 等仍在讨论中),离落地至少还有 1–2 个标准周期。</p></int>C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











