Hacker News 中文摘要

RSS订阅

Chromium中被禁用的C++特性 -- Banned C++ features in Chromium

文章摘要

Chromium对现代C++特性的采用采取谨慎态度,不会在新标准发布后立即允许使用新特性,而是等待工具链支持成熟后再逐步支持。该指南总结了Chromium及其子项目支持的C++新特性和Abseil库功能,子项目可根据工具链支持情况制定更严格的标准。

文章总结

Chromium 项目中的现代 C++ 使用规范

本文档是 Chromium C++ 风格指南的一部分,总结了 Chromium 项目对新版 C++ 标准和 Abseil 库特性的支持状态。

核心原则

  1. 标准采用策略:Chromium 不会在新标准发布后立即允许使用所有新特性,而是在工具链支持达到一定程度后宣布"初步支持"某个标准。

  2. 特性状态变更:开发者可以通过邮件向 cxx@chromium.org 提议修改某个特性的状态。

  3. 当前标准支持状态

    • C++11/C++14:默认允许
    • C++17:默认允许(部分禁用特性)
    • C++20:2023年11月13日起初步支持
    • C++23:2026年1月起初步支持
    • C++26:暂不支持
    • Abseil:默认允许(部分禁用特性)

禁用特性和第三方代码

  1. 第三方库:原则上允许使用禁用特性,但需注意编译器支持和安全性问题。

  2. 接口处理:调用第三方库接口时如需使用禁用类型,应:

    • 仅在接口处使用
    • 尽快转换为允许的类型
    • 避免使用因安全或编译器支持问题被禁用的特性

主要禁用特性

C++11 禁用语言特性

  • 内联命名空间
  • long long 类型(建议使用 <stdint.h> 中的类型)
  • 用户定义字面量

C++11 禁用库特性

  • 字符处理相关头文件(建议使用 Abseil 替代)
  • 浮点环境控制
  • <chrono>(与 base/time 重叠)
  • 异常处理(Chromium 禁用异常)
  • <random> 中的引擎和生成器
  • <ratio>
  • <regex>(建议使用 RE2)
  • std::aligned_storage/std::aligned_union
  • std::bind(使用 base::Bind
  • std::function(使用 base::Callback
  • std::shared_ptr/std::weak_ptr
  • 字符串/数字转换函数(使用 base/strings
  • 线程支持库(与 base/synchronization 重叠)

C++17 禁用特性

  • UTF-8 字符字面量
  • 数学特殊函数
  • 并行算法
  • std::any
  • std::byte
  • std::filesystem
  • std::from_chars/std::to_chars
  • 内存资源管理相关

允许使用的 C++20 特性

语言特性

  • 缩写函数模板
  • consteval 说明符
  • 概念和约束
  • 默认比较
  • 指定初始化器
  • constinit 说明符
  • 位域成员初始化
  • 带初始化器的 lambda 捕获
  • [[likely]]/[[unlikely]] 属性
  • 带初始化器的范围 for 循环
  • 三路比较运算符
  • using enum 声明

库特性

  • <bit> 头文件
  • <compare> 头文件
  • <concepts> 头文件
  • 范围算法
  • 范围访问原语
  • 库特性测试宏
  • <numbers> 数学常量
  • std::assume_aligned
  • std::erase/std::erase_if
  • std::hardware_destructive_interference_size
  • std::lerp 线性插值
  • std::midpoint 中点计算
  • std::ranges::subrange
  • std::string::starts_with/ends_with

其他注意事项

  1. Abseil 库:大部分 Abseil 功能默认允许,但部分功能如日志、命令标志、容器工具等被禁用。

  2. 待定特性:文档中列出了许多处于评估状态的语言和库特性(标记为 TBD),开发者可以参与讨论这些特性的采用。

  3. 迁移指南:许多特性都有对应的 Chromium 内部替代方案,文档中提供了详细的迁移建议和相关讨论链接。

这份指南为 Chromium 开发者提供了明确的现代 C++ 特性使用规范,平衡了语言新特性的优势与项目特定的需求和限制。

评论总结

以下是评论内容的总结,平衡呈现不同观点并保留关键引用:

  1. 对禁用列表的总体评价

    • 中性观点:认为大部分禁用合理,如避免本地化问题("avoiding locale-hell"),但部分只是用内部方案替代标准库("We have something in-house...instead of the standard lib")。
    • 批评观点:认为列表过长,C++特性过多("This list is longer than the features in all of C")。
  2. 关于禁用异常

    • 支持禁用:认为异常不适合大型项目("cause problems in a project this size")。
    • 反对观点:质疑广泛禁用却无替代方案("Exceptions are banned, but an exception is made for Windows" / "people still insist they're good")。
  3. 语言设计对比

    • 认为C++需禁用特性是语言缺陷,而Java/C#通过设计规避("Java eliminated the features that you would want to ban")。
    • 延伸讨论:建议关注Rust是否有类似问题("I'd curious about the banned Rust features")。
  4. 具体规则争议

    • 对UTF-8字面量的支持:认为应直接使用UTF-8源码而非特殊语法("Source code should all be UTF-8 natively")。
    • 对模块系统的批评:建议借鉴D语言设计("Modules are banned - they should have just copied D modules")。
  5. 工具与实施建议

    • 呼吁通过编译器强制禁用("make the compiler complain when you try to use these features")。
    • 要求明确替代方案("Where does it list the preferred alternatives to banned features?")。
  6. 项目历史与情感

    • 开发者感叹代码库历史久远("we broke ground on this codebase 20 years ago")。
  7. 极端观点

    • 完全否定C++("C++ itself should be forever banned")。

关键引用保留:
- "We have something in-house...instead of the standard lib"
- "Java eliminated the features that you would want to ban"
- "Source code should all be UTF-8 natively"
- "This list is longer than the features in all of C"