RFC-0258:从 C++17 更新为 C++20

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 功能,即使尚未记录为正式受支持。