RFC-0258:從 C++17 更新至 C++20

RFC-0258:從 C++17 更新至 C++20
狀態已接受
區域
  • 建構
  • 語言和程式庫
  • 工具鏈
說明

從 C++17 更新為 C++20,並將 SDK 中正式支援的 C++ 版本擴充至包含 C++20。

問題
Gerrit 變更
作者
審查人員
提交日期 (年-月-日)2024-08-01
審查日期 (年-月-日)2024-09-10

摘要

按照 RFC-0193:支援的 C++ 版本中所述的程序,此 RFC 建議從 C++17 更新為 C++20,做為 Fuchsia 樹狀結構的 C++ 版本,並擴充 SDK 中正式支援的 C++ 版本組合,納入 C++20。

提振精神

根據 RFC-0193:支援的 C++ 版本,Fuchsia 平台和 SDK 僅支援 C++17 版本。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++ 標準由建構引數控制。我們打算提交變更,將 Fuchsia 樹狀結構的 C++ 版本從 C++17 更新為 C++20,但請 Fuchsia 開發人員在 RFC 獲得核准前避免使用 C++20 功能,以便在需要時保留回復至 C++17 的功能。

現有的 CI/CQ 建構工具會在 C++20 模式中建構 Fuchsia 樹狀結構。這些資源最終會關閉,而釋出的資源會重新用於測試日後的 C++ 版本 (例如 C++23)。

成效

C++20 擴大了編譯時間評估的用途,包括將許多標準容器的建構函式標示為 constexpr,這可能會在某些情況下改善執行階段效能,但到目前為止,我們並未觀察到任何明顯差異。

Ergonomics

除了 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 測試涵蓋率,我們應為 SDK 中包含的每個套件編譯測試,使用 C++17 和 C++20,就像我們為 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 功能,即使這些功能尚未在文件中列為正式支援。