
本月早些時候,ISO C++ 委員會正式凍結了 C++26 的功能集,這標誌著 C++ 的下一個主要版本迎來了一個重要里程碑。其中,編譯時反射、契約、非同步執行等眾多備受矚目的新特性赫然在列。
靜態反射 (Static reflection) 支援在編譯期對型別和行為進行自省,其目標是擴充套件 C++ 的超程式設計能力。在基礎層面,反射允許開發者編寫如下程式碼,輕鬆將列舉 (enum) 轉換為字串:
enum Color { red, green, blue };
static_assert(enum_to_string(Color::red) == "red");
使用反射的表層語法非常簡潔,這與 現代 C++ 的設計哲學 保持了一致。然而, 上述功能的底層實現卻要複雜得多。儘管如此,我們依然可以從中一窺反射即將解鎖的強大能力:
template <typename E>
requires std::is_enum_v<E>
constexpr std::string enum_to_string(E value) {
templatefor(constexprauto e : std::meta::members_of(^E)){
if (value == [:e:]) {
return std::string(std::meta::name_of(e));
}
}
return"<unnamed>";
}
反射將以一種早期形態首次亮相於 C++,並有望在未來的版本中不斷演進。即便如此,它已然足夠強大,足以支援一些高階用例,例如為 JavaScript 和 Python 等其他語言生成繫結。Herb Sutter 在其最新的 Trip Report 中如此描述該特性:
即便只是利用我們目前擁有的這部分初始反射能力,我們就已經可以對 C++ 型別進行反射,並利用這些資訊加上普通的 std::cout,從而生成任意額外的 C++ 原始碼,然後將這些新生成的程式碼在程式構建過程中一同編譯並連結進去。
未來,利用反射,我們甚至有望透過“令牌注入”(token injection)的方式,在同一個原始檔中直接生成 C++ 程式碼。
在最近的 ISO C++ 委員會會議上,被接納進標準的新特性還包括:用於 Ranges 庫 的並行演算法;旨在非同步上下文中透過 RAII(資源分配即初始化)風格程式設計來進行資源管理的 非同步作用域 (async scopes);以及能為執行緒池提供高階執行上下文的 並行排程器 (parallel scheduler)。
此前會議中已接納的一些主要特性包括契約 (contracts)、非同步執行 (asynchronous execution) 以及眾多其他功能,例如:透過包索引 (pack indexing) 增強模板超程式設計、用於包含二進位制資源的 #embed 指令、邊界檢查迭代器和空指標驗證、SIMD 並行等等。
契約 (Contracts) 旨在透過 [[pre:]]、[[post:]] 和 contract_assert 來支援“契約式設計”。該特性 原計劃在 C++20 中引入,但最終從最終草案中被移除,如今它終於正式進入標準。
std::execution 提供了一套在通用執行資源上管理非同步執行的機制。其核心概念是傳送者 (sender) 和接收者 (receiver):傳送者代表一個非同步工作單元,它將其結果傳送給接收者。該框架還由與非同步操作相關聯的狀態 (state) 和一個輕量級排程器 (scheduler) 等概念共同構成。
C++26 的相關工作仍在繼續,但正如 Sutter 所強調的,其完成進度比許多人預期的要快得多,目前 GCC 和 Clang 已經支援了約三分之二的已採納語言特性。InfoQ 將持續關注並報道下一代 C++ 標準的演進過程。
原文連結:
https://www.infoq.com/news/2025/06/cpp-26-feature-complete/
點選底部閱讀原文訪問 InfoQ 官網,獲取更多精彩內容!
