中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++20的四大新特性有哪些

發布時間:2021-10-15 10:09:20 來源:億速云 閱讀:247 作者:柒染 欄目:編程語言

本篇文章為大家展示了C++20的四大新特性有哪些,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

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

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

  C++20 的編譯器支持

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

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

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

  上面的截圖僅展示了對應表格的前面一部分,可以看出這些編譯器的表現并不是非常令人滿意。即使你使用的是全新的編譯器,這些編譯器仍然不支持很多新特性。通常來說,你能找到嘗試這些新特性的方法。下面是兩個示例:

  概念:GCC 支持概念的前一個版本;

  std::jthread:GitHub 上有一個實現草案。

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

  C++20四大新特性

  概念(concept)

  使用模板進行通用編程的關鍵思想是定義能通過各種類型(type)使用的函數和類。但是,在實例化模板時經常會出現用錯類型的問題,其結果通常是幾頁難懂的報錯信息。

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

  模板的要求是接口的一部分;

  類模板中的函數重載或特殊化可以基于概念進行;

  因為編譯器能夠比較模板參數的要求與實際的模板參數,所以能得到更好的報錯信息。

  但是,這還不是全部。

  你可以使用預定義的概念,也可以定義你自己的概念;

  auto 和概念的用法統一到了一起。你可以不使用 auto,而是使用概念;

  如果一個函數聲明使用了一個概念,那么它會自動變成一個函數模板。由此,編寫函數模板就變得與編寫函數一樣簡單。

  下面的代碼片段展示了一個簡單概念 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 這個概念需要 std::is_integral::value 中的類型參數 T。std::is_integral::value 這個函數來自 type-traits 庫,它能在 T 為整數檢查編譯時間。如果 std::is_integral::value 的值為 true,則沒有問題。如果不為 true,則你會收到一個編譯時間報錯。

  gcd 算法是基于歐幾里德算法確定最大公約數(greatest common divisor)。我使用了這個縮寫函數模板句法來定義 gcd。gcd 要求其參數和返回類型支持概念 Integral。gcd 是一類對參數和返回值都有要求的函數模板。當我刪除這個句法糖(syntactic sugar)時,也許你能看到 gcd 的真正本質。下面這段代碼在語義上與 gcd 算法等效:

  template

  requires Integral()

  T gcd(T a, T b){

  if( b == 0 ) return a;

  else return gcd(b, a % b);

  }

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

  范圍庫(Ranges Library)

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

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

  可以寬松地評估;

  可以組合。

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

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

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

  協程是廣義的函數,能在保持狀態的同時暫停或繼續。協程通常用來編寫事件驅動型應用。事件驅動型應用可以是模擬、游戲、服務器、用戶接口或算法。協程也通常被用于協作式多任務(cooperative multitasking)。

  我們這里不介紹 C++20 的具體協程,而會介紹編寫協程的框架。編寫協程的框架由 20 多個函數構成,其中一部分需要你去實現,另一部分則可能需要重寫。因此,你可以根據需求調整協程。下面展示了一個特定協程的用法。

  下面的程序使用了一個能產生無限數據流的生成器:

  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;   }   必須補充幾句。這段代碼只是一個代碼段。函數 getNext 是一個協程,因為它使用了關鍵字 co_yield。getNext 有一個無限的循環,其會在 co_yield 之后返回 value。調用 next()(注釋的 第 2、3 行)會繼續這個協程,接下來的 getValue 調用會獲取這個值。在 getNext 調用之后,這個協程再一次暫停。其暫停會一直持續到下一次調用 next()。我的這個示例中有一個很大的未知,即 getNext 函數的返回值 Generator。   模塊(Module)

  模塊部分簡單介紹一下就好。模塊承諾能夠實現:

  更快的編譯時間;

  宏的隔離;

  表達代碼的邏輯結構;

  不必再使用頭文件(header file);

  擺脫丑陋的宏方法。

上述內容就是C++20的四大新特性有哪些,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

高邮市| 博野县| 扶余县| 高台县| 延川县| 贵阳市| 拜泉县| 中卫市| 青州市| 淳化县| 赣榆县| 霸州市| 郑州市| 安西县| 道真| 绍兴市| 郴州市| 沙河市| 白山市| 成武县| 八宿县| 焉耆| 建宁县| 长宁县| 华宁县| 定安县| 刚察县| 拉孜县| 梁河县| 瑞昌市| 北川| 保靖县| 滨海县| 类乌齐县| 富顺县| 临海市| 观塘区| 宣城市| 洛南县| 克山县| 老河口市|