| 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 功能。
非目标
- 立即在 Fuchsia 中提供 C++20 标准中的所有功能。
设计
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 build 在 C++20 模式下构建 Fuchsia 树。 这些资源最终会被停用,释放出的资源将重新用于测试未来的 C++ 版本(例如 C++23)。
性能
C++20 扩展了对编译时评估的使用,包括将许多标准容器的构造函数标记为 constexpr,这在某些情况下可能会提高运行时性能,但到目前为止尚未观察到任何显著差异。
工效学设计
除了 stdcompat 库中已提供的功能之外,还可以访问所有 C++20 标准库功能,从而减少样板代码并提高 C++ 语言的易用性。
概念或协程等语言功能可以进一步提高人体工程学性能,但它们在 Fuchsia 树中的使用不在本 RFC 的范围内,应在未来的 RFC 中进行介绍。
向后兼容性
必须继续在 SDK 中支持 C++17。树内(或“平台”)代码(不属于 SDK API 表面)可以开始依赖 C++20 功能,从而与 C++17 不兼容。
安全注意事项
不适用
隐私注意事项
不适用
测试
我们有一个基本的 SDK 测试,该测试会尝试使用 C++17 和 C++20 编译 SDK 中的所有 C++ 头文件,以确保我们不会引入与任一版本不兼容的代码,但此测试不会捕获 C++ 源文件中的问题。
为了提高 SDK 测试覆盖率,我们应该使用 C++17 和 C++20 编译 SDK 中包含的每个软件包的测试,就像之前对 stdcompat 所做的那样。
文档
我们将更新 SDK 文档,以反映 C++20 除了 C++17 之外也已获得正式支持;我们还将记录 SDK 用户可用的 C++20 功能支持方面的限制。
Zircon 中的 C++ 将更新为涵盖受支持的 C++20 功能及其使用限制。
缺点、替代方案和未知因素
虽然我们一直尝试通过 stdcompat 库提供部分 C++20 标准库功能,但实现更多功能需要投入大量资金,在某些情况下,如果没有 C++20 语言支持,则无法实现。
在先技术和参考资料
Google 和 Chromium 已经以 C++20 为目标。该 SDK 已经支持 C++20,并且 Google 和 Chromium 等合作伙伴依赖于 C++20 功能,即使尚未正式记录为受支持。