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 功能。

非目标

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