所謂現代 c++,指的是從 c++11 開始的 c++,從 c++11 開始,加入一些比較現代的語言特性和改進了的庫實現,使得用 c++ 開發少了很多心智負擔,程序也更加健壯,“看起來像一門新語言”。
從 c++11 開始,每 3 年發布一個新版本,到今年(2024)已經有 5 個版本了,分別是 c++11、c++14、c++17、c++20、c++23,這 5 個版本引入了上百個新的語言特性和新的標準庫特性。
c++11 新特性
c++11 是一個 major 版本,現代 c++ 開天辟地的版本,有特別多新東西。
新的語言特性[1]:
- 內存模型——一個高效的為現代硬件設計的底層抽象,作為描述并發的基礎
- auto 和 decltype——避免類型名稱的不必要重復
- 范圍 for——對范圍的簡單順序遍歷
- 移動語義和右值引用——減少數據拷貝
- 統一初始化—— 對所有類型都(幾乎)完全一致的初始化語法和語義
- nullptr——給空指針一個名字
- constexpr 函數——在編譯期進行求值的函數
- 用戶定義字面量——為用戶自定義類型提供字面量支持
- 原始字符串字面量——不需要轉義字符的字面量,主要用在正則表達式中
- 屬性——將任意信息同一個名字關聯
- lambda 表達式——匿名函數對象
- 變參模板——可以處理任意個任意類型的參數的模板
- 模板別名——能夠重命名模板并為新名稱綁定一些模板參數
- noexcept——確保函數不會拋出異常的方法
- override 和 final——用于管理大型類層次結構的明確語法
- static_assert——編譯期斷言
- long long——更長的整數類型
- 默認成員初始化器——給數據成員一個默認值,這個默認值可以被構造函數中的初始化所取代
- enum class——枚舉值帶有作用域的強類型枚舉
新的標準庫特性[1]:
- unique_ptr 和 shared_ptr——依賴 RAII 的資源管理指針
- 內存模型和 atomic 變量
- thread、mutex、condition_variable 等——為基本的系統層級的并發提供了類型安全、可移植的支持
- future、promise 和 packaged_task,等——稍稍更高級的并發
- tuple——匿名的簡單復合類型
- 類型特征(type trait)——類型的可測試屬性,用于元編程
- 正則表達式匹配
- 隨機數——帶有許多生成器(引擎)和多種分布
- 時間——time_point 和 duration
- unordered_map 等——哈希表
- forward_list——單向鏈表
- array——具有固定常量大小的數組,并且會記住自己的大小
- emplace 運算——在容器內直接構建對象,避免拷貝
- exception_ptr——允許在線程之間傳遞異常
c++14 新特性
c++14 是一個 minor 版本,沒什么重要的新特性,主要是在給 c++11 打補丁,為使用者 “帶來極大方便”,實現 “對新手更為友好” 這一目標。
新的語言特性[2]:
- 泛型的lambda
- Lambda捕獲部分中使用表達式
- 函數返回類型推導
- 另一種類型推斷:decltype(auto)
- 放松的constexpr函數限制
- 變量模板
- 聚合類成員初始化
- 二進制字面量: 0b或0B 前綴
- 數字分位符
- deprecated 屬性
新的標準庫特性[2]:
- 共享的互斥體和鎖: std::shared_timed_mutex
- 元函數的別名
- 關聯容器中的異構查找
- 標準自定義字面量
- 通過類型尋址多元組
- 較小的標準庫特性: std::make_unique, std::is_final 等
c++17 新特性
c++17 是一個 major 版本。
新的語言特性[3]:
- 構造函數模板參數推導——簡化對象定義
- 推導指引——解決構造函數模板參數推導歧義的顯式標注
- 結構化綁定——簡化標注,并消除一種未初始化變量的來源
- inline 變量——簡化了那些僅有頭文件的庫實現中的靜態分配變量的使用
- 折疊表達式——簡化變參模板的一些用法
- 條件中的顯式測試——有點像 for 語句中的條件
- 保證的復制消除——去除了很多不必要的拷貝操作
- 更嚴格的表達式求值順序——防止了一些細微的求值順序錯誤
- auto 當作模板參數類型——值模板參數的類型推導
- 捕捉常見錯誤的標準屬性——
[[maybe_unused]]、[[nodiscard]] 和 [[fallthrough]]
- 十六進制浮點字面量
- 常量表達式 if——簡化編譯期求值的代碼
新的標準庫特性[3]:
- optional、any 和 variant——用于表達“可選”的標準庫類型
- shared_mutex 和 shared_lock(讀寫鎖)和 scoped_lock
- 并行 STL——標準庫算法的多線程及矢量化版本
- 文件系統——可移植地操作文件系統路徑和目錄的能力
- string_view——對不可變字符序列的非所有權引用
- 數學特殊函數——包括拉蓋爾和勒讓德多項式、貝塔函數、黎曼澤塔函數
c++20 新特性
c++20 是一個 major 版本,有很重要的更新,“The Big Four”,即四個重要的特性,分別是:概念、范圍、協程和模塊。
新的語言特性[4]:
- coroutines
- concepts
- designated initializers
- template syntax for lambdas
- range-based for loop with initializer
[[likely]]
and[[unlikely]]
attributes- deprecate implicit capture of this
- class types in non-type template parameters
- constexpr virtual functions
- explicit(bool)
- immediate functions
- using enum
- lambda capture of parameter pack
- char8_t
- constinit
新的標準庫特性[4]:
- concepts library
- synchronized buffered outputstream
- std::span
- bit operations
- math constants
- std::is_constant_evaluated
- std::make_shared supports arrays
- starts_with and ends_with on strings
- check if associative container has element
- std::bit_cast
- std::midpoint
- std::to_array
c++23 新特性
c++23 是一個 minor 版本。
新的語言特性[5]:
- 新語言功能特性測試宏
- 顯式對象形參,顯式對象成員函數(推導 this)
- if consteval / if not consteval
- 多維下標運算符(例如 v[1, 3, 7] = 42;)
- static operator()
- static operator[]
- auto(x):語言中的衰退復制
- lambda 表達式上的屬性
- 可選的擴展浮點類型:std::float{16|32|64|128}_t 和 std::bfloat16_t。
- (有符號)std::size_t 字面量的字面量后綴 ‘Z’/‘z’
- 后綴
- #elifdef、#elifndef 與 #warning
- 通過新屬性 [[assume(表達式)]] 進行假設
- 具名通用字符轉義
- 可移植源文件編碼為 UTF-8
- 行拼合之前修剪空白
新的標準庫特性[5]:
- 新的庫功能特性測試宏
- 新的范圍折疊算法
- 字符串格式化改進
- “平鋪(flat)”容器適配器:std::flat_map、std::flat_multimap、std::flat_set、std::flat_multiset
- std::mdspan
- std::generator
- std::basic_string::contains, std::basic_string_view::contains
- 禁止從 nullptr 構造 std::string_view
- std::basic_string::resize_and_overwrite
- std::optional 的單子式操作:or_else、and_then、transform
- 棧蹤跡(stacktrace)庫
- 新的范圍算法
- 新的范圍適配器(視圖)
- 對范圍庫的修改
- 對視圖的修改
- 標記不可達代碼:std::unreachable
- 新的詞匯類型 std::expected
- std::move_only_function
- 新的帶有程序提供的固定大小緩沖區的 I/O 流 std::spanstream
- std::byteswap
- std::to_underlying
- 關聯容器的異質擦除
參考
[1] Bjarne Stroustrup. c++11:感覺像是門新語言. Cpp-Club. Available at : https://github.com/Cpp-Club/Cxx_HOPL4_zh/blob/main/04.md, 2023-6-11.
[2] Wikipedia. c++14. Available at: https://zh.wikipedia.org/wiki/c++14.
[3] 玩轉Linux內核. 快速入門c++17:了解最新的語言特性和功能. Available at: https://zhuanlan.zhihu.com/p/664746128, 2023-11-06.
[4] AnthonyCalandra. modern-cpp-features:CPP20. Available at: https://github.com/AnthonyCalandra/modern-cpp-features/blob/master/CPP20.md, 2023-3-19.
[5] cppreference. c++23. Available at: https://zh.cppreference.com/w/cpp/23, 2024-3-3.