本篇文章為大家展示了C++20的四大新特性有哪些,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。
專注于為中小企業(yè)提供網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站制作服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)赫章免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了上千多家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。C++20(C++ 編程語(yǔ)言標(biāo)準(zhǔn) 2020 版)將是 C++ 語(yǔ)言一次非常重大的更新,將為這門語(yǔ)言引入大量新特性。近日,C++ 開發(fā)者 Rainer Grimm 正通過(guò)一系列博客文章介紹 C++20 的新特性。目前這個(gè)系列文章已經(jīng)更新了兩篇,本篇是第一篇,主要介紹了 C++20 的 Big Four(四大新特性:概念、范圍、協(xié)程和模塊)以及核心語(yǔ)言(包括一些新的運(yùn)算符和指示符)。
C++20 有很多更新,上圖展示了 C++20 更新的概況。下面作者首先介紹 了 C++20 的編譯器支持情況,然后介紹 The Big Four(四大新特性)以及核心語(yǔ)言方面的新特性。
C++20 的編譯器支持
適應(yīng)新特性的最簡(jiǎn)單方法是試用它們。那么接下來(lái)我們就面臨著這個(gè)問(wèn)題:哪些編譯器支持 C++20 的哪些特性?一般來(lái)說(shuō),http://cppreference.com/compiler_support_能提供在核心語(yǔ)言和庫(kù)方面的答案。
簡(jiǎn)單來(lái)說(shuō),全新的 GCC、Clang 和 EDG 編譯器能提供對(duì)核心語(yǔ)言的很好支持。此外,MSVC 和 Apple Clang 編譯器也支持許多 C++20 特性。
庫(kù)方面的情況類似。GCC 在庫(kù)方面的支持好,接下來(lái)是 Clang 和 MSVC 編譯器。
上面的截圖僅展示了對(duì)應(yīng)表格的前面一部分,可以看出這些編譯器的表現(xiàn)并不是非常令人滿意。即使你使用的是全新的編譯器,這些編譯器仍然不支持很多新特性。通常來(lái)說(shuō),你能找到嘗試這些新特性的方法。下面是兩個(gè)示例:
概念:GCC 支持概念的前一個(gè)版本;
std::jthread:GitHub 上有一個(gè)實(shí)現(xiàn)草案。
簡(jiǎn)單來(lái)說(shuō),問(wèn)題沒有那么嚴(yán)重。只需要一些調(diào)整修改,很多新特性就能進(jìn)行嘗試。如有必要,我會(huì)提到如何進(jìn)行這樣的修改。
C++20四大新特性
概念(concept)
使用模板進(jìn)行通用編程的關(guān)鍵思想是定義能通過(guò)各種類型(type)使用的函數(shù)和類。但是,在實(shí)例化模板時(shí)經(jīng)常會(huì)出現(xiàn)用錯(cuò)類型的問(wèn)題,其結(jié)果通常是幾頁(yè)難懂的報(bào)錯(cuò)信息。
現(xiàn)在概念來(lái)了,這個(gè)問(wèn)題可以休矣。概念讓你能為模板編寫要求,而編譯器則可以檢查這個(gè)要求。概念革新了我們思考和編寫通用代碼的方式。原因如下:
模板的要求是接口的一部分;
類模板中的函數(shù)重載或特殊化可以基于概念進(jìn)行;
因?yàn)榫幾g器能夠比較模板參數(shù)的要求與實(shí)際的模板參數(shù),所以能得到更好的報(bào)錯(cuò)信息。
但是,這還不是全部。
你可以使用預(yù)定義的概念,也可以定義你自己的概念;
auto 和概念的用法統(tǒng)一到了一起。你可以不使用 auto,而是使用概念;
如果一個(gè)函數(shù)聲明使用了一個(gè)概念,那么它會(huì)自動(dòng)變成一個(gè)函數(shù)模板。由此,編寫函數(shù)模板就變得與編寫函數(shù)一樣簡(jiǎn)單。
下面的代碼片段展示了一個(gè)簡(jiǎn)單概念 Integral 的定義和使用方式:
template
concept bool Integral(){
return std::is_integral::value;
}
Integral auto gcd(Integral auto a,
Integral auto b){
if( b == 0 ) return a;
else return gcd(b, a % b);
}
Integral 這個(gè)概念需要 std::is_integral::value 中的類型參數(shù) T。std::is_integral::value 這個(gè)函數(shù)來(lái)自 type-traits 庫(kù),它能在 T 為整數(shù)檢查編譯時(shí)間。如果 std::is_integral::value 的值為 true,則沒有問(wèn)題。如果不為 true,則你會(huì)收到一個(gè)編譯時(shí)間報(bào)錯(cuò)。
gcd 算法是基于歐幾里德算法確定較大公約數(shù)(greatest common divisor)。我使用了這個(gè)縮寫函數(shù)模板句法來(lái)定義 gcd。gcd 要求其參數(shù)和返回類型支持概念 Integral。gcd 是一類對(duì)參數(shù)和返回值都有要求的函數(shù)模板。當(dāng)我刪除這個(gè)句法糖(syntactic sugar)時(shí),也許你能看到 gcd 的真正本質(zhì)。下面這段代碼在語(yǔ)義上與 gcd 算法等效:
template
requires Integral()
T gcd(T a, T b){
if( b == 0 ) return a;
else return gcd(b, a % b);
}
如果你還沒看到 gcd 的真正本質(zhì),過(guò)幾周我還會(huì)專門發(fā)布一篇介紹概念的文章。
范圍庫(kù)(Ranges Library)
范圍庫(kù)是概念的首個(gè)客戶。它支持的算法滿足以下條件:
可以直接在容器上操作;無(wú)需迭代器指定一個(gè)范圍;
可以寬松地評(píng)估;
可以組合。
簡(jiǎn)單來(lái)說(shuō):范圍庫(kù)支持函數(shù)模式(functional patterns)。
代碼可能比語(yǔ)言描述更清楚。下面的函數(shù)用豎線符號(hào)展示了函數(shù)組成:
#include
#include
#include
int main(){
std::vector ints{0, 1, 2, 3, 4, 5};
auto even = [](int i){ return 0 == i % 2; };
auto square = [](int i) { return i * i; };
for (int i : ints | std::view::filter(even) |
std::view::transform(square)) {
std::cout << i << ' '; // 0 4 16 } } even 是一個(gè) lambda 函數(shù),其在 i 為偶數(shù)時(shí)返回;lambda 函數(shù) square 則會(huì)將 i 映射為它的平方。其余的必須從左到右讀取的第 i 個(gè)函數(shù)組成:for (int i : ints | std::view::filter(even) | std::view::transform(square)). 將過(guò)濾器 even 應(yīng)用于 ints 的每個(gè)元素,然后將其余的每個(gè)元素映射為它們的平方。如果你熟悉函數(shù)編程,那么這讀起來(lái)就像一篇散文詩(shī)。 協(xié)程(Coroutines)
協(xié)程是廣義的函數(shù),能在保持狀態(tài)的同時(shí)暫?;蚶^續(xù)。協(xié)程通常用來(lái)編寫事件驅(qū)動(dòng)型應(yīng)用。事件驅(qū)動(dòng)型應(yīng)用可以是模擬、游戲、服務(wù)器、用戶接口或算法。協(xié)程也通常被用于協(xié)作式多任務(wù)(cooperative multitasking)。
我們這里不介紹 C++20 的具體協(xié)程,而會(huì)介紹編寫協(xié)程的框架。編寫協(xié)程的框架由 20 多個(gè)函數(shù)構(gòu)成,其中一部分需要你去實(shí)現(xiàn),另一部分則可能需要重寫。因此,你可以根據(jù)需求調(diào)整協(xié)程。下面展示了一個(gè)特定協(xié)程的用法。
下面的程序使用了一個(gè)能產(chǎn)生無(wú)限數(shù)據(jù)流的生成器:
Generator getNext(int start = 0, int step = 1){
auto value = start;
for (int i = 0;; ++i){
co_yield value; // 1
value += step;
}
}
int main() {
std::cout << std::endl; std::cout << "getNext():"; auto gen = getNext(); for (int i = 0; i <= 10; ++i) { gen.next(); // 2 std::cout << " " << gen.getValue(); } std::cout << "\n\n"; std::cout << "getNext(100, -10):"; auto gen2 = getNext(100, -10); for (int i = 0; i <= 20; ++i) { gen2.next(); // 3 std::cout << " " << gen2.getValue(); } std::cout << std::endl; } 必須補(bǔ)充幾句。這段代碼只是一個(gè)代碼段。函數(shù) getNext 是一個(gè)協(xié)程,因?yàn)樗褂昧岁P(guān)鍵字 co_yield。getNext 有一個(gè)無(wú)限的循環(huán),其會(huì)在 co_yield 之后返回 value。調(diào)用 next()(注釋的 第 2、3 行)會(huì)繼續(xù)這個(gè)協(xié)程,接下來(lái)的 getValue 調(diào)用會(huì)獲取這個(gè)值。在 getNext 調(diào)用之后,這個(gè)協(xié)程再一次暫停。其暫停會(huì)一直持續(xù)到下一次調(diào)用 next()。我的這個(gè)示例中有一個(gè)很大的未知,即 getNext 函數(shù)的返回值 Generator。 模塊(Module)
模塊部分簡(jiǎn)單介紹一下就好。模塊承諾能夠?qū)崿F(xiàn):
更快的編譯時(shí)間;
宏的隔離;
表達(dá)代碼的邏輯結(jié)構(gòu);
不必再使用頭文件(header file);
擺脫丑陋的宏方法。
上述內(nèi)容就是C++20的四大新特性有哪些,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
文章名稱:C++20的四大新特性有哪些-創(chuàng)新互聯(lián)
文章轉(zhuǎn)載:http://jinyejixie.com/article42/dijhhc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開發(fā)、建站公司、靜態(tài)網(wǎng)站、網(wǎng)站設(shè)計(jì)公司、動(dòng)態(tài)網(wǎng)站、網(wǎng)站內(nèi)鏈
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容