現代 c++ 一:c++11 ~ c++23 新特性匯總

所謂現代 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.

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/12213.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/12213.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/12213.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

藍橋杯備戰22.k倍區間——前綴和

目錄 題目 分析 暴力求解 優化思路 AC代碼 題目鏈接&#xff1a; P8649 [藍橋杯 2017 省 B] k 倍區間 - 洛谷 | 計算機科學教育新生態 (luogu.com.cn) 題目 分析 很明顯這題是一道前綴和的題 暴力求解 只得了28分 #include<iostream> using namespace std; co…

企業在實施RPA技術時,應如何確保其ROI評估的準確性和全面性?

企業在實施RPA&#xff08;Robotic Process Automation&#xff09;技術時&#xff0c;確保ROI&#xff08;投資回報率&#xff09;評估的準確性和全面性是至關重要的。以下是確保ROI評估準確性和全面性的一些關鍵步驟&#xff1a; ### 1. 明確業務目標 首先&#xff0c;企業需…

1、工廠模式

一、C常用設計模式 &#xff1a;工廠模式 1、why2、when3、what4、how 1、why #include <iostream>class Phone { };class XiaoMi : public Phone { };class Apple : public Phone { };class Huawei : public Phone { };class Oppo : public Phone { };class Vivo : pub…

求學生平均成績(C語言)

一、運行結果&#xff1b; 二、源代碼&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>//聲明平均數函數average; float average(float score[10]);int main() {//初始化變量值&#xff1b;float score[10], aver;int i 0;//填充數組&#xff1b;pr…

探秘WebSQL:輕松構建前端數據庫

歡迎來到我的博客&#xff0c;代碼的世界里&#xff0c;每一行都是一個故事 探秘WebSQL&#xff1a;輕松構建前端數據庫 前言WebSQL簡介WebSQL的基本操作WebSQL的實際應用WebSQL的局限性和替代方案 前言 在Web的世界里&#xff0c;我們總是追求更好的用戶體驗和更快的響應速度…

添磚Java之路(其八)——繼承,final關鍵字

目錄 繼承&#xff1a; super關鍵字&#xff1a; 方法重寫&#xff1a; 繼承特點&#xff1a; 繼承構造方法&#xff1a; final關鍵字&#xff1a; 繼承&#xff1a; 意義&#xff1a;讓類于類之間產生父類于子類的關系&#xff0c;子類可以直接使用父類中的非私有成員(包…

Seal^_^【送書活動第4期】——《Web滲透測試技術》

Seal^_^【送書活動第4期】——《Web滲透測試技術》 一、參與方式二、本期推薦圖書2.1 前 言2.2 關于本書2.3 本書讀者2.4 圖書簡介2.5 作者薦語2.6 編輯推薦2.7 目 錄 三、正版購買 掌握Web滲透測試技術&#xff0c;提高Web應用安全性。 一、參與方式 1、關注博主的賬號。 2、點…

目標檢測 yolov8 pth ==> onnx

目標檢測 yolov8 pth ==> onnx 1.安裝相關 pip install onnxruntime-gpu==1.14.0 -i https://pypi.tuna.tsinghua.edu.cn/simple pip install onnxsim -i https://mirror.baidu.com/pypi/simple2.創建轉化工具 注意相關: 1、修改需要轉換的模型路徑 2、修改類型文件 3…

leetcode22 括號生成-組合型回溯

題目 數字 n 代表生成括號的對數&#xff0c;請你設計一個函數&#xff0c;用于能夠生成所有可能的并且 有效的 括號組合。 示例 輸入&#xff1a;n 3 輸出&#xff1a;[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”] 解析 func generateParenthesis(n int) …

Linux下Code_Aster源碼編譯安裝及使用

目錄 軟件介紹 基本依賴 其它依賴 一、源碼下載 二、解壓縮 三、編譯安裝 四、算例運行 軟件介紹 Code_aster為法國電力集團&#xff08;EDF&#xff09;自1989年起開始研發的通用結構和熱力耦合有限元仿真軟件。Code_aster可用于力學、熱學和聲學等物理現象的仿真分析&…

CVPR2022人臉識別Partial FC論文及代碼學習筆記

論文鏈接&#xff1a;https://openaccess.thecvf.com/content/CVPR2022/papers/An_Killing_Two_Birds_With_One_Stone_Efficient_and_Robust_Training_CVPR_2022_paper.pdf 代碼鏈接&#xff1a;insightface/recognition/arcface_torch at master deepinsight/insightface G…

DeepLab V3+: 引入可分離卷積與Decoder網絡

文章目錄 摘要引入深度可分離卷積普通卷積深度卷積,Depthwise點卷積Introduction & Related WorkMethodsEncoder-Decoder with Atrous ConvolutionModified Aligned Xception實驗結果Decoder部分的消融實驗ResNet-101作為backbone

基于lidar的多目標跟蹤

文章目錄 基本流程編譯過程注意事項基本流程 基于雷達點云的目標追蹤主要包括以下幾個步驟: 點云預處理: 濾除噪點和無效點(如NaN值)進行平面分割,提取地面點云對剩余的點云進行聚類,得到可能的目標點云目標檢測 對聚類后的點云進行分析,判斷是否為有效目標可以利用目標的尺寸…

怎么轉換音頻?看這3款音頻轉換器

隨著數字媒體的發展&#xff0c;音頻文件在我們的日常生活中占據了越來越重要的地位。有時候在不同的應用場景里&#xff0c;無論是音樂、語音還是其他類型的音頻內容&#xff0c;我們都需要對其進行轉換以滿足不同的需求。 本文將為您介紹3款常用的音頻轉換器&#xff0c;幫助…

如何讓Linux崩潰?

如何使 Linux 系統崩潰 警告 下面的代碼行是 Bash shell 的一個簡短而甜蜜的 fork 炸彈。分叉炸彈之所以有效&#xff0c;是因為它能夠產生無限數量的進程。最終&#xff0c;Linux無法處理所有這些&#xff0c;并且會崩潰。 fork 炸彈的一大優點是你不需要 root 權限即可執行它…

Springboot+mybatis-plus+dynamic-datasource+繼承DynamicRoutingDataSource切換數據源

Springbootmybatis-plusdynamic-datasource繼承DynamicRoutingDataSource切換數據源 背景 最近公司要求支持saas&#xff0c;實現動態切換庫的操作&#xff0c;默認會加載主租戶的數據源&#xff0c;其他租戶數據源在使用過程中自動創建加入。 解決問題 1.通過請求中設置租…

數據可視化訓練第7天(json文件讀取國家人口數據,找出前10和后10)

數據 https://restcountries.com/v3.1/all&#xff1b;建議下載下來&#xff0c;并不是很大 import numpy as np import matplotlib.pyplot as plt import requests import json #由于訪問url過于慢&#xff1b;將數據下載到本地是json數據 #urlhttps://restcountries.com/v3…

MATLAB蟻群算法求解帶時間窗的旅行商TSPTW問題代碼實例

MATLAB蟻群算法求解帶時間窗的旅行商TSPTW問題代碼實例 蟻群算法編程求解TSPTW問題實例&#xff1a; 在經緯度范圍為(121, 43)到(123, 45)的矩形區域內&#xff0c;散布著1個商家&#xff08;編號1&#xff09;和25個顧客點&#xff08;編號為226&#xff09;&#xff0c;各個…

前端工程化實踐:Monorepo與Lerna管理

前端工程化實踐中&#xff0c;Monorepo&#xff08;單倉庫&#xff09;管理和Lerna是兩種流行的方式&#xff0c;用于大型項目或組件庫的組織和版本管理。 2500G計算機入門到高級架構師開發資料超級大禮包免費送&#xff01; Monorepo簡介 Monorepo&#xff08;單倉庫&#…

web入門練手案例(二)

下面是一下web入門案例和實現的代碼&#xff0c;帶有部分注釋&#xff0c;倘若代碼中有任何問題或疑問&#xff0c;歡迎留言交流~ 數字變色Logo 案例描述 “Logo”是“商標”的英文說法&#xff0c;是企業最基本的視覺識別形象&#xff0c;通過商標的推廣可以讓消費者了解企…