C++20新特性—概述
ISO / IEC 14882:2020(即C++20標(biāo)準(zhǔn))標(biāo)準(zhǔn)草案在2020年9月獲得了全票通過,年底能正式發(fā)布。對(duì)C++20,多數(shù)的評(píng)論是它具有可與C++11相比較的重大變化。
下圖是Rainer Grimm博文中給出的C++20的主要變化。
其實(shí),一門編程語(yǔ)言的變化大致上是應(yīng)該分兩個(gè)層面,一個(gè)是語(yǔ)言層面,即增加了語(yǔ)言新特性;二是庫(kù)層面,其實(shí)就是各種“語(yǔ)法糖”等,它們是在語(yǔ)言層面的基礎(chǔ)上擴(kuò)展、實(shí)現(xiàn)出來(lái)的,使用起來(lái)更“接地氣”。
cppreference 網(wǎng)站也給出了C++20的主要變化(https://en.cppreference.com/w/cpp/20),它就分了兩個(gè)部分:語(yǔ)言新特性和運(yùn)行庫(kù)新特性,其中運(yùn)行庫(kù)新特性又分為新增庫(kù)和新增類/函數(shù),如下圖所示。
從目前的資料來(lái)看,C++20的變化(以筆者的判斷,按“改變度”從大到小)主要體現(xiàn)在:
- module:module的引入,幾乎是革命性的,它同時(shí)增加了import,export兩個(gè)關(guān)鍵字,使C++可以擺脫C中“重復(fù)定義”,函數(shù)定義需要寫兩遍等歷史包袱,變得“現(xiàn)代”起來(lái)。
- concept(包括require):大量模板的使用,真的很有必要對(duì)模板參數(shù)的類型做一定的約束,concept就是為此目的,其實(shí),C#早就引入了where,現(xiàn)在C++補(bǔ)上了這一部分,對(duì)模板參數(shù)的約束比以前表達(dá)得簡(jiǎn)潔多了。
--上面可謂是“大”變化。
- Coroutines:“并行”執(zhí)行的一種方法,作為多線程的一種替代,特別適合“慢速”IO和“高速”計(jì)算并行的場(chǎng)合。Coroutines的概念也是早就有了,一些語(yǔ)言相繼引入,之前boost庫(kù)中實(shí)現(xiàn)了Coroutine的方法,C++11中實(shí)現(xiàn)了promise,現(xiàn)在C++引入了co_await、co_yeild、co_return這樣的關(guān)鍵字,終于在語(yǔ)言層面實(shí)現(xiàn)了Coroutine。
- ?Range,span:C++庫(kù)中大量的集合操作,如果有表達(dá)“范圍“的操作,一般采用 “映射函數(shù)”+新建集合的方法,現(xiàn)在有了range,span,view等概念,并且有一個(gè)range adaptor(|),此時(shí)表達(dá)就簡(jiǎn)潔多了。
- ?3-way comparasion:C++定義了一個(gè)新的有趣的比較符:<=>,它形似飛船,因而也稱作“spaceship operator”。集合操作中很常用的操作是“比大小”,<=>提供了一種更簡(jiǎn)潔的表達(dá)方式。
- consteval, constinit:這兩個(gè)關(guān)鍵字與constexpr有點(diǎn)類似,都是為了提高運(yùn)行時(shí)速度而在編譯時(shí)做處理。
--上面可謂是“小”變化。
- Feature testing:定義了幾個(gè)新的attributes,如likely, no_unique_address等,以及一些宏,可用于版本、功能的檢測(cè)。
- 新的線程支持:增加了jthread線程類和semaphore同步類等新的特性,與jthread相適應(yīng),增加線程外通知機(jī)制,總體感覺有一定用途,但不一定是必須的或自己也可以實(shí)現(xiàn)簡(jiǎn)化版。
- source_location:新增加< source_location>,它被劃分為utility,主要為了信息跟蹤(調(diào)試),而代替__FILE__,__LINE__等。
- ?text format:新的格式化輸出表達(dá)方式,感覺是C#輸出方式的“模擬”。
- 時(shí)間庫(kù)增強(qiáng):主要是增加了時(shí)區(qū)(time zone)和日歷(calendar)方面的計(jì)算、判斷等。
- ?計(jì)算(numeric)增強(qiáng):增加了一些計(jì)算類(宏),endian判斷支持以及按bit轉(zhuǎn)換等功能
- Synchronized output:增加了basic_syncbuf、basic_osyncstream模板類以及特化的類,它們被定義在<syncstream>中,在不同線程中,向它們的輸出不會(huì)再相互干擾了。
--上面可謂是增強(qiáng)。
除上述外,還可以列出一些。在筆者看來(lái),C++20確實(shí)給語(yǔ)言帶來(lái)比較大的變化,特別是Modules的引入,有讓人感嘆C++與C “漸行漸遠(yuǎn)”,而與C#,Java逐漸趨同的意味。
后面將分別介紹這些C++20引入的新特性。
?
總結(jié)
以上是生活随笔為你收集整理的C++20新特性—概述的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: carsim/trucksim获取轮胎侧
- 下一篇: C++ 条件运算符 (?:)