RFC-0258:从 C++17 更新为 C++20 | |
---|---|
状态 | 已接受 |
区域 |
|
说明 | 将 Fuchsia 树 C++ 版本从 C++17 更新为 C++20,并扩展 SDK 中正式支持的 C++ 版本集,以包含 C++20。 |
问题 | |
Gerrit 更改 | |
作者 | |
审核人 | |
提交日期(年-月-日) | 2024-08-01 |
审核日期(年-月-日) | 2024-09-10 |
摘要
按照 RFC-0193:受支持的 C++ 版本中所述的流程,此 RFC 建议将 Fuchsia 树 C++ 版本从 C++17 更新为 C++20,并将 SDK 中正式支持的 C++ 版本集扩展为包含 C++20。
设计初衷
根据 RFC-0193:支持的 C++ 版本,C++17 是 Fuchsia 平台和 SDK 中唯一受支持的版本。C++20 引入了许多新功能,这些功能显著改善了人体工学,但 Fuchsia 平台开发者目前无法使用这些改进。
利益相关方
教练:davemoore@google.com
审核者:
- ianloic@google.com
- jamesr@google.com
- mcgrathr@google.com
社交:在 Fuchsia C++ 用户和工具链团队之间进行讨论。
要求
- 将 Fuchsia 树 C++ 版本从 C++17 更新为 C++20。
- 允许树内平台代码依赖于 C++20 功能。
非目标
- 让 C++20 标准中的所有功能立即在 Fuchsia 中可用。
设计
Fuchsia 树可以使用 C++17 或 C++20 模式编译。这将将 Fuchsia 树使用的 C++ 版本从 C++17 更改为 C++20,之后将无法再选择在 C++17 模式下构建树内(或“平台”)代码。
实现
Fuchsia 树使用的 C++ 标准由 build 参数控制。我们计划提交一项更改,将 Fuchsia 树 C++ 版本从 C++17 更新为 C++20,但要求 Fuchsia 开发者在 RFC 获得批准之前避免使用 C++20 功能,以便在需要时能够回滚到 C++17。
现有的 CI/CQ 构建器会在 C++20 模式下构建 Fuchsia 树。这些测试最终会被关闭,并将释放的资源用于测试未来的 C++ 版本(例如 C++23)。
性能
C++20 扩大了对编译时评估的使用,包括将许多标准容器的构造函数标记为 constexpr
,这在某些情况下可能会提高运行时性能,但到目前为止还没有发现任何明显差异。
工效学设计
除了 stdcompat 库中已有的功能之外,还可以访问所有 C++20 标准库功能,这将减少样板代码并提高 C++ 语言的可用性。
概念或协程等语言功能可以进一步改善工效学,但它们在 Fuchsia 树中的使用超出了本 RFC 的范围,应由未来的 RFC 涵盖。
向后兼容性
SDK 中必须继续支持 C++17。不在 SDK API Surface 中的树内(或“平台”)代码可能会开始依赖于 C++20 功能,从而与 C++17 不兼容。
安全注意事项
不适用
隐私注意事项
不适用
测试
我们有一个基本的 SDK 测试,该测试会尝试使用 C++17 和 C++20 编译 SDK 中的所有 C++ 头文件,以确保我们不会引入与这两个版本不兼容的代码,但此测试不会发现 C++ 源文件中的问题。
为了提高 SDK 测试覆盖率,我们应使用 C++17 和 C++20 为 SDK 中包含的每个软件包编译测试,就像为 stdcompat 所做的那样。
文档
SDK 文档将更新,以反映除了 C++17 之外,我们还正式支持 C++20;我们还将记录 SDK 用户可用的 C++20 功能支持限制。
Zircon 中的 C++ 将更新为涵盖支持的 C++20 功能及其使用限制。
缺点、替代方案和未知情况
虽然我们一直在尝试通过 stdcompat 库提供 C++20 标准库功能的一部分,但实现其他功能需要投入大量资源,在某些情况下,如果没有 C++20 语言支持,就根本无法实现。
在先技术和参考文档
Google 和 Chromium 已以 C++20 为目标平台。该 SDK 已支持 C++20,Google 和 Chromium 等合作伙伴依赖于 C++20 功能,即使尚未记录为正式受支持。