回想1999年就開始學(xué)習(xí)C語言,C++主要用C++98,C++11這兩個(gè)版本,開發(fā)軟件從TurboC2.0、TurboC++3.0,到Visual C++、Visual Studio、Xcode等,從16年后逐漸用C/C++也少了,代碼寫得少了,而更喜歡使用Python、js等腳本語言,省心省力。
整個(gè)軟件開發(fā)行業(yè)用C/C++的也越來越少,但一些重要的地方仍然少了它的身影,C++標(biāo)準(zhǔn)也在發(fā)展,今天理一理C++的發(fā)展史,我似乎看到C++在不同年代的照片,如同昨天旅游時(shí)找出14年的照片,一張張的復(fù)刻,復(fù)刻的時(shí)光,意味著時(shí)間的流逝,意味著我們的老去!

初覽
C++ 的國際標(biāo)準(zhǔn)有 5 個(gè)版本,1998, 2003, 2011, 2014, 2017
C++98
C++98是第一個(gè)正式C++標(biāo)準(zhǔn),C++03是在C++98上面進(jìn)行了小幅度的修訂,其實(shí)C++在第一個(gè)標(biāo)準(zhǔn)C++98之前就已經(jīng)廣為使用了。
只不過那時(shí)候還沒有一個(gè)官方的統(tǒng)一標(biāo)準(zhǔn),后來才開始起草標(biāo)準(zhǔn)草案,起草了n年,直到98年才最終發(fā)布。(所以你可以看到一些早期的C++編譯器對標(biāo)準(zhǔn)的支持程度很差,比如經(jīng)典的VC6.0,在研發(fā)的時(shí)候C++的第一個(gè)標(biāo)準(zhǔn)還沒公布呢)
至于什么C89、C99這些,是C語言的標(biāo)準(zhǔn),不是C++的標(biāo)準(zhǔn),很容易被一些人混淆。
C++03
C++03 是給 C++98 打的補(bǔ)丁,所以現(xiàn)在的人提到 C++98, C++03 往往指的是同一個(gè)。
C++11
C++11則是一次全面的大進(jìn)化(之前稱C++11為C++0x,以為會在08~09年公布,沒想到拖到了11年)。
關(guān)鍵字及新語法
1.1. auto 關(guān)鍵字及用法
1.2. nullptr 關(guān)鍵字及用法
1.3. for 循環(huán)語法
STL 容器
2.1. std::array
2.2. std::forward_list
2.3. std::unordered_map
2.4. std::unordered_set
多線程
3.1. std::thread
3.2. std::atomic
3.3. std::condition_variable
智能指針內(nèi)存管理
4.1. std::shared_ptr
4.2. std::weak_ptr
其他
5.1. std::function、std::bind 封裝可執(zhí)行對象
5.2. lambda 表達(dá)式
C++14
C++14旨在作為C++11的一個(gè)小擴(kuò)展,主要提供漏洞修復(fù)和小的改進(jìn)。
1 新的語言特性
1.1 泛型的lambda
1.2 Lambda捕獲部分中使用表達(dá)式
1.3 函數(shù)返回類型推導(dǎo)
1.4 另一種類型推斷
1.5 放松的constexpr限制
1.6 變量模板
1.7 聚合體成員初始化
1.8 二進(jìn)制字面量
1.9 數(shù)字分位符
2 新的標(biāo)準(zhǔn)庫特性
2.1 共享的互斥體和鎖
2.2 元函數(shù)的別名
2.3 關(guān)聯(lián)容器中的異構(gòu)查找
2.4 標(biāo)準(zhǔn)自定義字面量
2.5 通過類型尋址多元組
2.6 較小的標(biāo)準(zhǔn)庫特性
3 已被移除或是不包含在C++14標(biāo)準(zhǔn)的特性
3.1 關(guān)于數(shù)組的擴(kuò)展
3.2 Optional值
3.3 Concepts Lite
C++17
1 關(guān)鍵字
1.1 constexpr
1.2 static_assert
1.3 auto
1.4 typename
1.5 inline
2 語法
2.1 折疊表達(dá)式
2.2 結(jié)構(gòu)化綁定
2.3 允許非類型模板參數(shù)進(jìn)行常量計(jì)算
2.4 條件分支語句初始化
2.5 聚合初始化
2.6 嵌套命名空間
2.7 lambda表達(dá)式捕獲*this的值
2.8 枚舉[類]對象的構(gòu)造
2.9 十六進(jìn)制單精度浮點(diǎn)數(shù)字面值
2.10 基于對齊內(nèi)存的動(dòng)態(tài)內(nèi)存分配
2.11 細(xì)化表達(dá)式的計(jì)算順序
2.12 模板類的模板參數(shù)自動(dòng)推導(dǎo)
2.13 簡化重復(fù)命名空間的屬性列表
2.14 不支持、非標(biāo)準(zhǔn)的屬性
2.15 改寫與繼承構(gòu)造函數(shù)
2.16 內(nèi)聯(lián)變量
2.17 用auto作為非類型模板參數(shù)
3 宏
3.1 __has_include
4 屬性
4.1 fallthrough
4.2 nodiscard
4.3 maybe_unuse
C++20
C++20 的 Big Four(四大新特性:概念、范圍、協(xié)程和模塊)以及核心語言(包括一些新的運(yùn)算符和指示符)。
1 關(guān)鍵字
1.1 concept
1.2 requires
1.3 typename
1.4 explicit
1.5 constexpr
1.6 char8_t
1.7 consteval
1.8 co_await、co_yield、co_return
1.9 constinit
2 語法
2.1 位域變量的默認(rèn)成員初始化
2.2 修改const限定的成員指針
2.3 允許lambda表達(dá)值按值捕獲this
2.4 指定初始化
2.5 lambda表達(dá)式支持模板
2.6 從構(gòu)造函數(shù)推導(dǎo)出模板參數(shù)類型
2.7 基于范圍的for循環(huán)初始化
2.8 簡化lambda的隱式捕獲
2.9 ADL與不可見的模板函數(shù)
2.10 operator<=>
2.11 基于范圍的for循環(huán)初始化
2.12 默認(rèn)可構(gòu)造可分配的無狀態(tài)lambdas
2.13 專門的訪問檢查
2.14 constexpr函數(shù)的實(shí)例化
2.15 允許lambda在初始化捕獲時(shí)進(jìn)行包擴(kuò)展
2.16 放寬結(jié)構(gòu)化綁定,新增自定義查找規(guī)則
2.17 放寬基于范圍的for循環(huán),新增自定義范圍方法
2.18 類類型的非類型模板參數(shù)
關(guān)于類類型的非類型模板參數(shù)的優(yōu)化
類類型的非類型模板參數(shù)的條件(滿足任意一個(gè)):
2.19 禁止使用用戶自己聲明的構(gòu)造函數(shù)來進(jìn)行聚合初始化
舊版的幾個(gè)問題
解決方案
2.20 嵌套內(nèi)聯(lián)命名空間
2.21 約束聲明的另一種辦法
2.22 允許在常量表達(dá)式中使用dynamic_cast多臺typeid
2.23 允許用圓括弧的值進(jìn)行聚合初始化
2.24 new表達(dá)式的數(shù)組元素個(gè)數(shù)的推導(dǎo)
2.25 unicode字符串字面量
2.26 允許轉(zhuǎn)換成未知邊界的數(shù)組
2.27 聚合初始化推導(dǎo)類模板參數(shù)
2.28 隱式地將返回的本地變量轉(zhuǎn)換為右值引用
2.29 允許default修飾運(yùn)算符按值比較
2.30 非類型模板參數(shù)等效的條件
3 宏
4 屬性
4.1 likely和unlikely
4.2 no_unique_address
4.3 nodiscard
5 棄用
5.1 lambda棄用使用[=]來隱式捕獲this
5.2 比較運(yùn)算符的改進(jìn)
5.3 棄用下標(biāo)表達(dá)式中的逗號操作符
9月4日,C++20 的國際標(biāo)準(zhǔn)草案(DIS, Draft International Standard)投票結(jié)束,最終獲全票批準(zhǔn)通過。
這意味著 C++20 已獲得了最終的技術(shù)批準(zhǔn),并完成了 ISO 的投票,預(yù)計(jì)在完成最后一輪 ISO 的編輯工作后,C++20 將在2020年底正式發(fā)布。
C++23
進(jìn)度表和計(jì)劃中...