作者 | Rainer Grimm?譯者 | 明明如月
C++23 將會是 C++20 后的下一個 C++ 標準。這個新標準對 C++ 進行了大幅改進,但其影響力卻不如 C++98、C++11 或 C++20 那樣翻天覆地。C++23 更像是 C++17 的傳統(tǒng)延續(xù)。
?
?
為了理解 C++ 的這一進化步驟,讓我們將 C++ 標準放在歷史背景中來看看。
C++ 標準
? ? C++ 已有超過 40 年的歷史了。那么,在這些年里,C++ 都經(jīng)歷了什么變化呢?以下是一個簡要的回答,一直延續(xù)到 C++23。
? C++98
? 在 20 世紀 80 年代末,Bjarne Stroustrup 和 Margaret A. Ellis 合著了他們的著名書籍 Annotated C++ Reference Manual(注釋版 C++ 參考手冊,簡稱 ARM)。這些書有兩個目的。首先,那時存在許多獨立的 C++ 實現(xiàn)。因此,ARM 定義了 C++ 的功能。其次,ARM 是第一個 C++ 標準 C++98(ISO/IEC 14882)的基礎。C++98 有幾個關鍵特性:模板、包含容器和算法的標準模板庫(STL)、字符串和 IO 流。
? C++03
? 隨著 C++03(14882:2003),C++98 得到了一項微小的技術修正,小到在我的時間線上都沒有容身之地。在社區(qū)中,包括 C++98 在內(nèi)的 C++03 被稱為傳統(tǒng)的 C++。
? TR1
? 2005 年,發(fā)生了一件令人非常興奮的事情。這一年,發(fā)布了所謂的技術報告 1(Technical Report 1,簡稱 TR1)。TR1 是向著 C++11,因此向著現(xiàn)代 C++ 的一大步。TR1(TR 19768)是基于 C++ 標準化委員會成員創(chuàng)立的 boost 項目。TR1 有 13 個庫,這些庫也成為下一個 C++ 標準的一部分。例如,庫對應到正則表達式庫、隨機數(shù)庫、智能指針如 std::shared_ptr,以及哈希表。只有所謂的特殊數(shù)學函數(shù)需要等到 C++17 才能使用。
? C++11
? C++11 是下一個 C++ 標準,但我們通常稱之為現(xiàn)代 C++。現(xiàn)代 C++ 也包括了 C++14 和 C++17。C++11 擁有許多特性,這些特性從根本上改變了我們編寫 C++ 程序的方式。例如,C++11 引入了 TR1 的組件,還有移動語義、完美轉(zhuǎn)發(fā)、變長模板或 `constexpr,還有其他諸多特性。隨著 C++11 的到來,我們還得到了一個內(nèi)存模型作為基礎的線程模型,以及一個線程 API。如果你感到好奇,這里有我關于內(nèi)存模型和多線程的一些基本文章。
? C++14
? C++14 是一個小型的 C++ 標準。它引入了讀寫鎖、泛化的 lambdas 和泛化的 constexpr 函數(shù)。
? C++17
? C++17 有兩個顯著的特性:并行 STL 和標準化的文件系統(tǒng)。大約 80 個 STL 算法可以使用所謂的執(zhí)行策略進行執(zhí)行。這意味著 std::par, vec.begin(), vec.end()) 對 C++ 實現(xiàn)的排序容器 vec 是一個并行處理的提示。此外,你還可以指定排序應按順序執(zhí)行(std::seq)或向量化執(zhí)行(std::par_unseq)。就像 C++11 一樣,boost 對 C++17 也產(chǎn)生了深遠影響。我們從 boost 獲取了文件系統(tǒng)以及三種新的數(shù)據(jù)類型:std::optional、std::variant 和 std::any。這里是我關于 C++17 (鏈接見文底)的一些文章。
? C++20
? C++20 的變革對我們編寫 C++ 程序的方式產(chǎn)生了根本性的影響,其程度不亞于 C++11。特別是以下四個重要特性:Ranges(范圍庫),Coroutines(協(xié)程),Concepts(概念),以及 Modules(模塊)。
? 新的 Ranges 庫讓我們可以直接在容器上表達算法,使用管道符組合算法,并將它們應用于無限數(shù)據(jù)流。
? 多虧了 Coroutines,異步編程在 C++ 中可能會成為主流。協(xié)程是協(xié)作任務、事件循環(huán)、無限數(shù)據(jù)流或管道的基礎。
? Concepts 將改變我們對模板的思考和編程方式。它們是有效模板參數(shù)的語義類別。它們讓你能夠直接在類型系統(tǒng)中表達你的意圖。如果出了什么問題,你會收到簡潔的錯誤信息。
? Modules 將克服頭文件的限制。它們帶來了很多好處。例如,預處理器將變得不再需要。最終,我們還將擁有更快的構(gòu)建時間,更簡單的包構(gòu)建方式。
? 關于 Ranges、Coroutines、Concepts、Modules 和 C++20 的文章可以參見鏈接。
? C++23
? 現(xiàn)在(2023年7月),C++23 已經(jīng)完成,并進入了最終投票階段。
? C++23 提供了一種小巧但影響深遠的核心語言特性——this 的推導。這種特性允許你,類似于 Python,在成員函數(shù)定義中明確地傳遞隱式傳遞的 this 指針。引入 this 的推導后,一些 C++ 中復雜的技術,例如 CRTP (奇異遞歸模板模式) 或者 Overload Pattern(過載模式),將變得輕而易舉。
? C++23 庫還將新增很多有意思的特性。你可以直接使用 import std; 導入標準庫,或者在 std::print 和 std::println 中應用 C++20 的格式字符串。此外,我們將出于性能考慮,獲得如 std::flat_map 這樣的扁平化關聯(lián)容器,這些容器在時間和空間復雜度上做了一個平衡。std::flap_map 可取代 std::map 。std::optional 的接口將擴展為具有組合性的單子接口。新的數(shù)據(jù)類型 std::expected 已經(jīng)具有可組合的接口,可以用于錯誤處理,存儲預期值或非預期值。多虧了 std::mdspan,我們可以創(chuàng)建和操作多維數(shù)組。最后,std::generator 是第一個用于創(chuàng)建數(shù)字流的具體的協(xié)程。std::generator 是 Ranges 庫的一部分,該庫也將在 C++23 中得到增強。
? ? 網(wǎng)友:比 Python 差遠了
? ? 很多網(wǎng)友對 C++23 的改進展開了廣泛討論,
? 很多網(wǎng)友對此次更新并沒有感到那么興奮。有網(wǎng)友表示很高興看到 C++23 將帶來 C++ 可用性的提升,但和 Python 還差很遠。有網(wǎng)友對此甚至表示失望,他認為 C++23 和 C++ 98 相比,并沒什么革命性的特性,居然還有人會為此感到興奮。
? 有的網(wǎng)友則愿意給 C++23 一個機會。他很久以來一直用 C++,但是他對 C++ 的復雜性感到不滿,所以他主要用 C++11。他說現(xiàn)在 C++ 有了模塊、概念等新特性,他開始考慮 C++23 是否值得用于新項目。他原本想用 Rust 代替 C++,但是現(xiàn)在他可能會給 C++23 一個機會。有網(wǎng)友認為 C++ 的復雜性是因為它承諾永遠能夠兼容舊的代碼造成的。
? 還很多網(wǎng)友在評論區(qū)對各種編程語言進行了討論。有網(wǎng)友認為,問題并不是出在語言本身,而取決于你用它來實現(xiàn)什么樣的功能。例如,如果你想使用虛幻引擎或編寫音頻插件,就學習 C++。如果你想玩機器學習,就學好Python。如果你想制作移動應用程序,就學習 Swift 或 Kotlin。
? 編輯:黃飛
?
評論
查看更多