自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

解讀C++即將迎來的重大更新:C++20的四大新特性

新聞 前端
C++20(C++ 編程語言標(biāo)準(zhǔn) 2020 版)將是 C++ 語言一次非常重大的更新,將為這門語言引入大量新特性。

 C++20(C++ 編程語言標(biāo)準(zhǔn) 2020 版)將是 C++ 語言一次非常重大的更新,將為這門語言引入大量新特性。近日,C++ 開發(fā)者 Rainer Grimm 正通過一系列博客文章介紹 C++20 的新特性。目前這個(gè)系列文章已經(jīng)更新了兩篇,本篇是第一篇,主要介紹了 C++20 的 Big Four(四大新特性:概念、范圍、協(xié)程和模塊)以及核心語言(包括一些新的運(yùn)算符和指示符)。

解读C++即将迎来的重大更新(一):C++20的四大新特性

C++20 有很多更新,上圖展示了 C++20 更新的概況。下面作者首先介紹 了 C++20 的編譯器支持情況,然后介紹 The Big Four(四大新特性)以及核心語言方面的新特性。

C++20 的編譯器支持

適應(yīng)新特性的最簡單方法是試用它們。那么接下來我們就面臨著這個(gè)問題:哪些編譯器支持 C++20 的哪些特性?一般來說,cppreference.com/compiler_support_能提供在核心語言和庫方面的答案。

簡單來說,全新的 GCC、Clang 和 EDG 編譯器能提供對核心語言的最佳支持。此外,MSVC 和 Apple Clang 編譯器也支持許多 C++20 特性。

解读C++即将迎来的重大更新(一):C++20的四大新特性

C++20 核心語言特征。

庫方面的情況類似。GCC 在庫方面的支持最好,接下來是 Clang 和 MSVC 編譯器。

解读C++即将迎来的重大更新(一):C++20的四大新特性

C++20 庫特征。

上面的截圖僅展示了對應(yīng)表格的前面一部分,可以看出這些編譯器的表現(xiàn)并不是非常令人滿意。即使你使用的是全新的編譯器,這些編譯器仍然不支持很多新特性。

通常來說,你能找到嘗試這些新特性的方法。下面是兩個(gè)示例:

  • 概念:

GCC 支持概念的前一個(gè)版本;

  • std::jthread:

GitHub 上有一個(gè)實(shí)現(xiàn)草案,來自 Nicolai Josuttis:

https://github.com/josuttis/jthread

簡單來說,問題沒有那么嚴(yán)重。只需要一些調(diào)整修改,很多新特性就能進(jìn)行嘗試。如有必要,我會提到如何進(jìn)行這樣的修改。

四大新特性

概念(concept)

使用模板進(jìn)行通用編程的關(guān)鍵思想是定義能通過各種類型(type)使用的函數(shù)和類。但是,在實(shí)例化模板時(shí)經(jīng)常會出現(xiàn)用錯(cuò)類型的問題,其結(jié)果通常是幾頁難懂的報(bào)錯(cuò)信息。

現(xiàn)在概念來了,這個(gè)問題可以休矣。概念讓你能為模板編寫要求,而編譯器則可以檢查這個(gè)要求。概念革新了我們思考和編寫通用代碼的方式。原因如下:

  • 模板的要求是接口的一部分;
  • 類模板中的函數(shù)重載或特殊化可以基于概念進(jìn)行;
  • 因?yàn)榫幾g器能夠比較模板參數(shù)的要求與實(shí)際的模板參數(shù),所以能得到更好的報(bào)錯(cuò)信息。

但是,這還不是全部。

  • 你可以使用預(yù)定義的概念,也可以定義你自己的概念;
  • auto 和概念的用法統(tǒng)一到了一起。你可以不使用 auto,而是使用概念;
  • 如果一個(gè)函數(shù)聲明使用了一個(gè)概念,那么它會自動變成一個(gè)函數(shù)模板。由此,編寫函數(shù)模板就變得與編寫函數(shù)一樣簡單。

下面的代碼片段展示了一個(gè)簡單概念 Integral 的定義和使用方式:

  1. template<typename T> 
  2. concept bool Integral(){ 
  3.     return std::is_integral<T>::value; 
  4.  
  5. Integral auto gcd(Integral auto a,      
  6.                   Integral auto b){ 
  7.     if( b == 0 ) return a;  
  8.     else return gcd(b, a % b); 

Integral 這個(gè)概念需要 std::is_integral<T>::value 中的類型參數(shù) T。std::is_integral<T>::value 這個(gè)函數(shù)來自 type-traits 庫,它能在 T 為整數(shù)檢查編譯時(shí)間。如果 std::is_integral<T>::value 的值為 true,則沒有問題。如果不為 true,則你會收到一個(gè)編譯時(shí)間報(bào)錯(cuò)。如果你很好奇(你也應(yīng)該好奇),我的這篇文章介紹了 type-traits 庫:https://www.modernescpp.com/index.php/tag/type-traits。

gcd 算法是基于歐幾里德算法確定最大公約數(shù)(greatest common divisor)。我使用了這個(gè)縮寫函數(shù)模板句法來定義 gcd。gcd 要求其參數(shù)和返回類型支持概念 Integral。gcd 是一類對參數(shù)和返回值都有要求的函數(shù)模板。當(dāng)我刪除這個(gè)句法糖(syntactic sugar)時(shí),也許你能看到 gcd 的真正本質(zhì)。

下面這段代碼在語義上與 gcd 算法等效:

  1. template<typename T> 
  2.  
  3. requires Integral<T>() 
  4.  
  5. T gcd(T a, T b){ 
  6.  
  7.     if( b == 0 ) return a;  
  8.  
  9.     else return gcd(b, a % b); 
  10.  

如果你還沒看到 gcd 的真正本質(zhì),過幾周我還會專門發(fā)布一篇介紹概念的文章。

范圍庫(Ranges Library)

范圍庫是概念的首個(gè)客戶。它支持的算法滿足以下條件:

可以直接在容器上操作;無需迭代器指定一個(gè)范圍;

可以寬松地評估;

可以組合。

簡單來說:范圍庫支持函數(shù)模式(functional patterns)。

代碼可能比語言描述更清楚。下面的函數(shù)用豎線符號展示了函數(shù)組成:

  1. #include <vector> 
  2.  
  3. #include <ranges> 
  4.  
  5. #include <iostream> 
  6.  
  7. int main(){ 
  8.  
  9.   std::vector<int> ints{012345}; 
  10.  
  11.   auto even = [](int i){ return 0 == i % 2; }; 
  12.  
  13.   auto square = [](int i) { return i * i; }; 
  14.  
  15.   for (int i : ints | std::view::filter(even) |  
  16.  
  17.                       std::view::transform(square)) { 
  18.  
  19.     std::cout << i << ' ';             // 0 4 16 
  20.  
  21.   } 
  22.  

even 是一個(gè) lambda 函數(shù),其在 i 為偶數(shù)時(shí)返回;lambda 函數(shù) square 則會將 i 映射為它的平方。其余的必須從左到右讀取的第 i 個(gè)函數(shù)組成:for (int i : ints | std::view::filter(even) | std::view::transform(square)). 將過濾器 even 應(yīng)用于 ints 的每個(gè)元素,然后將其余的每個(gè)元素映射為它們的平方。如果你熟悉函數(shù)編程,那么這讀起來就像一篇散文詩。

協(xié)程(Coroutines)

協(xié)程是廣義的函數(shù),能在保持狀態(tài)的同時(shí)暫?;蚶^續(xù)。協(xié)程通常用來編寫事件驅(qū)動型應(yīng)用。事件驅(qū)動型應(yīng)用可以是模擬、游戲、服務(wù)器、用戶接口或算法。協(xié)程也通常被用于協(xié)作式多任務(wù)(cooperative multitasking)。

我們這里不介紹 C++20 的具體協(xié)程,而會介紹編寫協(xié)程的框架。編寫協(xié)程的框架由 20 多個(gè)函數(shù)構(gòu)成,其中一部分需要你去實(shí)現(xiàn),另一部分則可能需要重寫。因此,你可以根據(jù)需求調(diào)整協(xié)程。

下面展示了一個(gè)特定協(xié)程的用法。下面的程序使用了一個(gè)能產(chǎn)生無限數(shù)據(jù)流的生成器:

  1. Generator<int> getNext(int start = 0int step = 1){ 
  2.  
  3.     auto value = start; 
  4.  
  5.     for (int i = 0;; ++i){ 
  6.  
  7.         co_yield value;            // 1 
  8.  
  9.         value += step; 
  10.  
  11.     } 
  12.  
  13.  
  14. int main() { 
  15.  
  16.     std::cout << std::endl; 
  17.  
  18.     std::cout << "getNext():"
  19.  
  20.     auto gen = getNext(); 
  21.  
  22.     for (int i = 0; i <= 10; ++i) { 
  23.  
  24.         gen.next();               // 2 
  25.  
  26.         std::cout << " " << gen.getValue();                   
  27.  
  28.     } 
  29.  
  30.     std::cout << "nn"
  31.  
  32.     std::cout << "getNext(100, -10):"
  33.  
  34.     auto gen2 = getNext(100, -10); 
  35.  
  36.     for (int i = 0; i <= 20; ++i) { 
  37.  
  38.         gen2.next();             // 3 
  39.  
  40.         std::cout << " " << gen2.getValue(); 
  41.  
  42.     } 
  43.  
  44.     std::cout << std::endl; 
  45.  

必須補(bǔ)充幾句。這段代碼只是一個(gè)代碼段。函數(shù) getNext 是一個(gè)協(xié)程,因?yàn)樗褂昧岁P(guān)鍵字 co_yield。getNext 有一個(gè)無限的循環(huán),其會在 co_yield 之后返回 value。調(diào)用 next()(注釋的 第 2、3 行)會繼續(xù)這個(gè)協(xié)程,接下來的 getValue 調(diào)用會獲取這個(gè)值。在 getNext 調(diào)用之后,這個(gè)協(xié)程再一次暫停。其暫停會一直持續(xù)到下一次調(diào)用 next()。我的這個(gè)示例中有一個(gè)很大的未知,即 getNext 函數(shù)的返回值 Generator<int>。這部分內(nèi)容很復(fù)雜,后面我在寫協(xié)程的文章中更詳細(xì)地介紹。

使用 Wandbox 在線編譯器,我可以向你展示這個(gè)程序的輸出:

解读C++即将迎来的重大更新(一):C++20的四大新特性

模塊(Module)

模塊部分簡單介紹一下就好。模塊承諾能夠?qū)崿F(xiàn):

  • 更快的編譯時(shí)間;
  • 宏的隔離;
  • 表達(dá)代碼的邏輯結(jié)構(gòu);
  • 不必再使用頭文件(header file);
  • 擺脫丑陋的宏方法。

 

責(zé)任編輯:張燕妮 來源: 機(jī)器之心
相關(guān)推薦

2010-05-25 08:34:10

C# 4.0

2011-04-02 09:45:00

Ubuntu 11.0特性

2021-10-12 07:15:03

C++20特性

2024-02-05 22:13:50

C++C++20開發(fā)

2024-01-19 21:07:22

C++20Concepts函數(shù)

2024-12-18 11:30:00

C++20比較運(yùn)算符

2020-12-21 21:05:29

C++C++20標(biāo)準(zhǔn)草案

2010-01-22 09:52:32

JPA 2.0Java EE 6

2021-04-06 15:05:55

鴻蒙HarmonyOS應(yīng)用

2010-03-15 09:04:09

C++Visual Stud

2010-09-03 08:47:51

2010-06-09 10:48:55

F#Silverlight

2023-11-04 20:00:02

C++20協(xié)程

2010-01-21 14:07:14

CC++聲明

2015-10-26 09:04:21

PHP7新特性

2009-07-07 12:30:38

JDK1.6

2020-12-11 07:23:03

微信更新移動應(yīng)用

2010-05-13 08:57:22

jQuery 1.4

2015-02-04 10:49:13

Visual C++C++Windows API

2025-02-27 09:48:24

JavaScriptDate?對象
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號