旅行报告:美国圣路易斯的夏季 ISO C++ 会议 | think-cell

两周前,作者参加了在美国圣路易斯举行的 ISO C++标准化委员会 2024 年夏季会议,这是即将推出的 C++26 标准的第四次会议。

  • 图书馆演化与相关研究组:作者大部分时间在图书馆演化方面,主持 SG9 研究组,为std::ranges提案提供早期反馈。此次还在 SG23 研究组花了一整天,该组专注于安全。

    • 发送者/接收者(Senders/receivers)P2300是一个添加新并发编程方式的大提案,类似std::ranges改变了范围算法的编写方式,std::execution将改变并发代码的编写方式。通过组合发送者(本质上是延迟的未来,最终会发送一些值)和接收者(只是花哨的回调)来描述数据流,特殊的发送者可用于将执行转移到不同线程或在线程池中调度。但细节复杂,包含大量定制机制、元编程和新概念,使用|操作符或编写协程可组合现有发送者,但实现复杂,易导致编译时间增加、优化器工作增多和错误信息难以理解。环境的概念引入了环境依赖的发送者,增加了复杂性,如std::execution::read_env(property)的类型取决于环境,可能导致编译错误难以定位。Eric Niebler 提出P3164旨在改善发送者/接收者误用时的编译器错误消息,引发了对环境是否值得的思考,同时对 P2300 的审查和大量修改也存在担忧。
    • 反射(Reflection)P2996为 C++添加了反射,可反射实体得到std::meta::info对象,能查询信息、创建新对象或生成新代码,用于实现枚举到字符串的转换等。语言方面已通过演化小组委员会审查,但所选的反射语法(如^foo)可能与 Objective C 块产生解析歧义,作者的第二选择%foo也不理想。图书馆演化审查了查询std::meta::info对象信息的库 API,std::meta::info对象是编译器内部 AST 的不透明句柄,有一系列获取信息的函数,但编译器无法通过类型系统检测无意义的函数调用,API 审查仍在进行中,作者担心其与标准库的耦合。
    • C++借用检查(C++ borrow checking):C++委员会成立 SG23 研究组讨论安全提案,Bjarne Stroustrup 提出P3274添加安全配置文件,可通过属性有选择地在代码部分启用编译时和运行时检查,但论文未详细提出具体配置。Sean Baxter 在其circle C++编译器中实现了 Rust 的借用检查器,引入带生命周期注释的借用检查引用,但存在采用问题,会导致语言分叉为安全和不安全库,需要自下而上(部分)重写代码,且若重写代码不如直接用 Rust 获得更多好处,作者认为 C++不需要成为安全语言,应专注于与 Rust 的互操作性。
阅读 14
0 条评论