文章摘要
Chromium对现代C++特性的采用采取谨慎态度,不会在新标准发布后立即允许使用新特性,而是等待工具链支持成熟后再逐步支持。该指南总结了Chromium及其子项目支持的C++新特性和Abseil库功能,子项目可根据工具链支持情况制定更严格的标准。
文章总结
Chromium 项目中的现代 C++ 使用规范
本文档是 Chromium C++ 风格指南的一部分,总结了 Chromium 项目对新版 C++ 标准和 Abseil 库特性的支持状态。
核心原则
标准采用策略:Chromium 不会在新标准发布后立即允许使用所有新特性,而是在工具链支持达到一定程度后宣布"初步支持"某个标准。
特性状态变更:开发者可以通过邮件向 cxx@chromium.org 提议修改某个特性的状态。
当前标准支持状态:
- C++11/C++14:默认允许
- C++17:默认允许(部分禁用特性)
- C++20:2023年11月13日起初步支持
- C++23:2026年1月起初步支持
- C++26:暂不支持
- Abseil:默认允许(部分禁用特性)
禁用特性和第三方代码
第三方库:原则上允许使用禁用特性,但需注意编译器支持和安全性问题。
接口处理:调用第三方库接口时如需使用禁用类型,应:
- 仅在接口处使用
- 尽快转换为允许的类型
- 避免使用因安全或编译器支持问题被禁用的特性
主要禁用特性
C++11 禁用语言特性
- 内联命名空间
- long long 类型(建议使用
<stdint.h>中的类型) - 用户定义字面量
C++11 禁用库特性
- 字符处理相关头文件(建议使用 Abseil 替代)
- 浮点环境控制
<chrono>(与base/time重叠)- 异常处理(Chromium 禁用异常)
<random>中的引擎和生成器<ratio><regex>(建议使用 RE2)std::aligned_storage/std::aligned_unionstd::bind(使用base::Bind)std::function(使用base::Callback)std::shared_ptr/std::weak_ptr- 字符串/数字转换函数(使用
base/strings) - 线程支持库(与
base/synchronization重叠)
C++17 禁用特性
- UTF-8 字符字面量
- 数学特殊函数
- 并行算法
std::anystd::bytestd::filesystemstd::from_chars/std::to_chars- 内存资源管理相关
允许使用的 C++20 特性
语言特性
- 缩写函数模板
consteval说明符- 概念和约束
- 默认比较
- 指定初始化器
constinit说明符- 位域成员初始化
- 带初始化器的 lambda 捕获
[[likely]]/[[unlikely]]属性- 带初始化器的范围 for 循环
- 三路比较运算符
using enum声明
库特性
<bit>头文件<compare>头文件<concepts>头文件- 范围算法
- 范围访问原语
- 库特性测试宏
<numbers>数学常量std::assume_alignedstd::erase/std::erase_ifstd::hardware_destructive_interference_sizestd::lerp线性插值std::midpoint中点计算std::ranges::subrangestd::string::starts_with/ends_with
其他注意事项
Abseil 库:大部分 Abseil 功能默认允许,但部分功能如日志、命令标志、容器工具等被禁用。
待定特性:文档中列出了许多处于评估状态的语言和库特性(标记为 TBD),开发者可以参与讨论这些特性的采用。
迁移指南:许多特性都有对应的 Chromium 内部替代方案,文档中提供了详细的迁移建议和相关讨论链接。
这份指南为 Chromium 开发者提供了明确的现代 C++ 特性使用规范,平衡了语言新特性的优势与项目特定的需求和限制。
评论总结
以下是评论内容的总结,平衡呈现不同观点并保留关键引用:
对禁用列表的总体评价
- 中性观点:认为大部分禁用合理,如避免本地化问题("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")。
关于禁用异常
- 支持禁用:认为异常不适合大型项目("cause problems in a project this size")。
- 反对观点:质疑广泛禁用却无替代方案("Exceptions are banned, but an exception is made for Windows" / "people still insist they're good")。
语言设计对比
- 认为C++需禁用特性是语言缺陷,而Java/C#通过设计规避("Java eliminated the features that you would want to ban")。
- 延伸讨论:建议关注Rust是否有类似问题("I'd curious about the banned Rust features")。
具体规则争议
- 对UTF-8字面量的支持:认为应直接使用UTF-8源码而非特殊语法("Source code should all be UTF-8 natively")。
- 对模块系统的批评:建议借鉴D语言设计("Modules are banned - they should have just copied D modules")。
工具与实施建议
- 呼吁通过编译器强制禁用("make the compiler complain when you try to use these features")。
- 要求明确替代方案("Where does it list the preferred alternatives to banned features?")。
项目历史与情感
- 开发者感叹代码库历史久远("we broke ground on this codebase 20 years ago")。
极端观点
- 完全否定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"