天天看點

C++23:下一個 C++ 标準

作者:CSDN
C++23:下一個 C++ 标準

【編者按】C++23 是 C++20 之後的下一個 C++ 标準,它包含了對 C++ 的一系列改進,但對于 C++98、C++11 或 C++20 那樣具有革命性的影響力較小,更像是 C++17 的延續。

原文連結:http://modernescpp.com/index.php/c-23-the-next-c-standard

未經允許,禁止轉載!

作者 | Rainer Grimm 譯者 | 明明如月

責編 | 夏萌出品 | CSDN(ID:CSDNnews)

C++23 将會是 C++20 後的下一個 C++ 标準。這個新标準對 C++ 進行了大幅改進,但其影響力卻不如 C++98、C++11 或 C++20 那樣翻天覆地。C++23 更像是 C++17 的傳統延續。

C++23:下一個 C++ 标準

為了了解 C++ 的這一進化步驟,讓我們将 C++ 标準放在曆史背景中來看看。

C++23:下一個 C++ 标準

C++ 标準

C++ 已有超過 40 年的曆史了。那麼,在這些年裡,C++ 都經曆了什麼變化呢?以下是一個簡要的回答,一直延續到 C++23。C++98在 20 世紀 80 年代末,Bjarne Stroustrup 和 Margaret A. Ellis 合著了他們的著名書籍 Annotated C++ Reference Manual(注釋版 C++ 參考手冊,簡稱 ARM)。這些書有兩個目的。首先,那時存在許多獨立的 C++ 實作。是以,ARM 定義了 C++ 的功能。其次,ARM 是第一個 C++ 标準 C++98(ISO/IEC 14882)的基礎。C++98 有幾個關鍵特性:模闆、包含容器和算法的标準模闆庫(STL)、字元串和 IO 流。C++03随着 C++03(14882:2003),C++98 得到了一項微小的技術修正,小到在我的時間線上都沒有容身之地。在社群中,包括 C++98 在内的 C++03 被稱為傳統的 C++。TR12005 年,發生了一件令人非常興奮的事情。這一年,釋出了所謂的技術報告 1(Technical Report 1,簡稱 TR1)。TR1 是向着 C++11,是以向着現代 C++ 的一大步。TR1(TR 19768)是基于 C++ 标準化委員會成員創立的 boost 項目。TR1 有 13 個庫,這些庫也成為下一個 C++ 标準的一部分。例如,庫對應到正規表達式庫、随機數庫、智能指針如 std::shared_ptr,以及哈希表。隻有所謂的特殊數學函數需要等到 C++17 才能使用。C++11C++11 是下一個 C++ 标準,但我們通常稱之為現代 C++。現代 C++ 也包括了 C++14 和 C++17。C++11 擁有許多特性,這些特性從根本上改變了我們編寫 C++ 程式的方式。例如,C++11 引入了 TR1 的元件,還有移動語義、完美轉發、變長模闆或 `constexpr,還有其他諸多特性。随着 C++11 的到來,我們還得到了一個記憶體模型作為基礎的線程模型,以及一個線程 API。如果你感到好奇,這裡有我關于記憶體模型和多線程的一些基本文章。C++14C++14 是一個小型的 C++ 标準。它引入了讀寫鎖、泛化的 lambdas 和泛化的 constexpr 函數。C++17C++17 有兩個顯著的特性:并行 STL 和标準化的檔案系統。大約 80 個 STL 算法可以使用所謂的執行政策進行執行。這意味着 std::sort(std::execute::par, vec.begin(), vec.end()) 對 C++ 實作的排序容器 vec 是一個并行處理的提示。此外,你還可以指定排序應按順序執行(std::execution::seq)或向量化執行(std::execution::par_unseq)。就像 C++11 一樣,boost 對 C++17 也産生了深遠影響。我們從 boost 擷取了檔案系統以及三種新的資料類型:std::optional、std::variant 和 std::any。這裡是我關于 C++17 (連結見文底)的一些文章。C++20C++20 的變革對我們編寫 C++ 程式的方式産生了根本性的影響,其程度不亞于 C++11。特别是以下四個重要特性:Ranges(範圍庫),Coroutines(協程),Concepts(概念),以及 Modules(子產品)。新的 Ranges 庫讓我們可以直接在容器上表達算法,使用管道符組合算法,并将它們應用于無限資料流。多虧了 Coroutines,異步程式設計在 C++ 中可能會成為主流。協程是協作任務、事件循環、無限資料流或管道的基礎。Concepts 将改變我們對模闆的思考和程式設計方式。它們是有效模闆參數的語義類别。它們讓你能夠直接在類型系統中表達你的意圖。如果出了什麼問題,你會收到簡潔的錯誤資訊。Modules 将克服頭檔案的限制。它們帶來了很多好處。例如,預處理器将變得不再需要。最終,我們還将擁有更快的建構時間,更簡單的包建構方式。關于 Ranges、Coroutines、Concepts、Modules 和 C++20 的文章可以參見連結。(連結見文底)C++23現在(2023年7月),C++23 已經完成,并進入了最終投票階段。C++23 提供了一種小巧但影響深遠的核心語言特性——this 的推導。這種特性允許你,類似于 Python,在成員函數定義中明确地傳遞隐式傳遞的 this 指針。引入 this 的推導後,一些 C++ 中複雜的技術,例如 CRTP (奇異遞歸模闆模式) 或者 Overload Pattern(過載模式),将變得輕而易舉。C++23 庫還将新增很多有意思的特性。你可以直接使用 import std; 導入标準庫,或者在 std::print 和 std::println 中應用 C++20 的格式字元串。此外,我們将出于性能考慮,獲得如 std::flat_map 這樣的扁平化關聯容器,這些容器在時間和空間複雜度上做了一個平衡。std::flap_map 可取代 std::map 。std::optional 的接口将擴充為具有組合性的單子接口。新的資料類型 std::expected 已經具有可組合的接口,可以用于錯誤處理,存儲預期值或非預期值。多虧了 std::mdspan,我們可以建立和操作多元數組。最後,std::generator 是第一個用于建立數字流的具體的協程。std::generator 是 Ranges 庫的一部分,該庫也将在 C++23 中得到增強。

C++23:下一個 C++ 标準

網友:比 Python 差遠了很多網友對 C++23 的改進展開了廣泛讨論,很多網友對此次更新并沒有感到那麼興奮。有網友表示很高興看到 C++23 将帶來 C++ 可用性的提升,但和 Python 還差很遠。有網友對此甚至表示失望,他認為 C++23 和 C++ 98 相比,并沒什麼革命性的特性,居然還有人會為此感到興奮。有的網友則願意給 C++23 一個機會。他很久以來一直用 C++,但是他對 C++ 的複雜性感到不滿,是以他主要用 C++11。他說現在 C++ 有了子產品、概念等新特性,他開始考慮 C++23 是否值得用于新項目。他原本想用 Rust 代替 C++,但是現在他可能會給 C++23 一個機會。有網友認為 C++ 的複雜性是因為它承諾永遠能夠相容舊的代碼造成的。還很多網友在評論區對各種程式設計語言進行了讨論。有網友認為,問題并不是出在語言本身,而取決于你用它來實作什麼樣的功能。例如,如果你想使用虛幻引擎或編寫音頻插件,就學習 C++。如果你想玩機器學習,就學好Python。如果你想制作移動應用程式,就學習 Swift 或 Kotlin。你對 C++23 的改進有何看法?歡迎在評論區交流讨論。參考連結1、 Annotated C++ Reference Manual:http://www.stroustrup.com/arm.html2、 boost 項目:https://www.boost.org/3、記憶體模型:https://www.modernescpp.com/index.php/category/multithreading-memory-model4、多線程:https://www.modernescpp.com/index.php/category/multithreading5、 C++17:https://www.modernescpp.com/index.php/category/c-176、 Ranges:https://www.modernescpp.com/index.php/tag/ranges-library7、Coroutines:https://www.modernescpp.com/index.php/tag/coroutines8、Concepts:https://www.modernescpp.com/index.php/tag/concepts9、Modules:https://www.modernescpp.com/index.php/tag/modules10、C++20:https://www.modernescpp.com/index.php/category/c-20