C++26標準草案現已完成,資深C++專家及前ISO C++標準委員會主席Herb Sutter報導。最終草案引入了反射機制,增強了記憶體安全而無需重寫程式碼,新增了包含前置條件與後置條件的合約功能及新的斷言語句,並建立了統一的併發與平行框架。
反射是一種機制,正如Sutter所述,賦予開發者掌握C++內部機制的鑰匙,使語言能自我描述並生成程式碼,為元程式設計提供堅實基礎。符合C++精神,反射不帶來執行時負擔。反射的基本示例展示了如何利用反射實現C++介面的專用語法。
反射能簡化C++未來的演進,減少對眾多專屬新語言特性的需求,因為許多功能現在可作為可重用的編譯期函式庫來表達,設計更快、測試更易、且從一開始就具備可攜性。
介面抽象是cppfront編譯器的一部分,該編譯器產生純ISO C++程式碼,由Sutter創建以加速提案實驗。它還包含如copyable(表達可複製/移動建構與賦值的類型)、ordered(定義完全排序類型operator<=>)、union(帶名稱的標記聯合)、regex等抽象。
C++26另一重要改進領域是記憶體安全。包括開箱即用消除讀取未初始化區域變數的未定義行為,以及對大多數標準庫類型(如vector、span、string、string_view)的邊界安全。Sutter表示,這些改變已在Apple與Google的生產環境中部署,涵蓋數億行C++程式碼。
這不僅是紙上設計。僅Google就已修復超過1000個錯誤,預計每年可防止1000至2000個錯誤,並使生產環境的段錯誤率降低30%。
更重要的是,這些效益僅透過使用新編譯器重新編譯現有程式碼即可達成。只有七個案例因高度優化程式碼無法被編譯器分析,開發者須使用細粒度API選擇性地在特定部分關閉記憶體安全。
C++26合約將防禦式程式設計引入語言,提升功能與記憶體安全。它允許開發者表達方法執行前後不可違反的前置與後置條件。合約使斷言可移至函式宣告中,對呼叫者與靜態分析工具可見。C++提供四種合約違反處理方式:忽略、觀察、強制與快速強制。此外,新增原生斷言機制取代C語言的assert巨集。
最後,C++26引入std::execution作為表達與控制併發和平行的框架。該框架三大抽象為scheduler、sender與receiver,可透過一組可自訂的非同步演算法組合。std::execution設計與C++20協程良好整合,使撰寫結構化(嚴格生命週期巢狀)併發和平行程式更容易,並能從設計上避免資料競爭。
兩大C++編譯器GCC與Clang已在標準化過程中實作大部分C++26功能,這些功能將很快納入主流版本。