You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么for co_await范围循环特性未被纳入C++20标准?

C++20未纳入for co_await特性的核心原因

背景

你提到的cppcoro库代码是for co_await的典型使用场景:

cppcoro::async_generator<int> ticker(int count, threadpool& tp)
{
  for (int i = 0; i < count; ++i)
  {
    co_await tp.delay(std::chrono::seconds(1));
    co_yield i;
  }
}

cppcoro::task<> consumer(threadpool& tp)
{
  auto sequence = ticker(10, tp);
  for co_await (std::uint32_t i : sequence)
  {
    std::cout << "Tick " << i << std::endl;
  }
}

按照Coroutine TS的定义,for co_await属于异步范围for语法糖,会被展开为包含co_await的迭代逻辑,专门用于遍历异步生成器产出的序列,你提到的等价展开规则是完全正确的。

未进入C++20的具体原因

  • 标准交付优先级与时间窗口限制
    C20的核心协程语言特性(co_await/co_yield/co_return)本身的评审落地就占用了大量委员会时间,且该特性在当时仍存在不少设计争议需要优先解决。for co_await属于上层语法糖特性,优先级低于核心协程机制,在C20功能冻结节点前没有足够时间完成全流程的提案评审、语法规则打磨和多厂商实现验证,因此被延后到后续版本迭代。
  • 配套库规范未成熟
    for co_await的核心使用场景是遍历async_generator这类异步序列,而C++20的标准库完全没有纳入异步生成器、异步迭代器的相关规范,单独推出语法特性没有对应的标准库支撑,实用价值极低。委员会倾向于等异步序列的库设计完全成熟后,再同步推出配套语法支持。
  • 设计细节存在未决共识
    当时Coroutine TS中定义的for co_await展开规则还存在多个未决争议点,包括异步迭代过程中的异常处理逻辑、对不同类别异步迭代器的适配性、和普通范围for的语法兼容性边界等,在C++20定稿前没有达成全委员会的统一共识,仓促纳入可能留下难以修复的设计缺陷。

补充说明:同步版本的std::generator已经纳入C23标准,for co_await和异步生成器特性目前已经进入C26的标准迭代计划,未来会和异步迭代器相关规范一起落地。

内容的提问来源于stack exchange,提问作者Desmond Gold

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 07:36:03