C++20新增內容

C++20 是 C++ 語言的一次重大更新,它引入了許多新特性,使代碼更現代化、簡潔且高效。以下是 C++20 的主要新增內容:


1. 概念(Concepts)

概念用于約束模板參數,使模板編程更加直觀和安全。

#include <concepts>
#include <iostream>template <std::integral T>  // 約束 T 必須是整數類型
T add(T a, T b) {return a + b;
}int main() {std::cout << add(3, 4) << "\n"; // OK// std::cout << add(3.5, 4.2); // 編譯錯誤:double 不是整數
}

2. 范圍庫(Ranges)

C++20 引入了 std::ranges 以更優雅地操作序列。

#include <ranges>
#include <vector>
#include <iostream>int main() {std::vector<int> v = {1, 2, 3, 4, 5};for (int x : v | std::views::filter([](int n) { return n % 2 == 0; })) {std::cout << x << " ";  // 輸出: 2 4}
}

3. 協程(Coroutines)

C++20 引入了協程,使得異步編程更加高效。

#include <coroutine>
#include <iostream>struct Task {struct promise_type {Task get_return_object() { return {}; }std::suspend_never initial_suspend() { return {}; }std::suspend_never final_suspend() noexcept { return {}; }void return_void() {}void unhandled_exception() {}};
};Task example() {std::cout << "Hello, ";co_await std::suspend_always{};std::cout << "World!\n";
}int main() {example();  // 輸出: Hello,
}

4. std::span(輕量級數組視圖)

std::span 提供更安全和高效的數組訪問方式,無需拷貝數據。

#include <span>
#include <iostream>void print(std::span<int> s) {for (int n : s) std::cout << n << " ";
}int main() {int arr[] = {1, 2, 3, 4, 5};print(arr);  // 自動推導為 span
}

5. 三路比較運算符(<=>,Spaceship Operator)

引入三路比較運算符 operator<=>,簡化比較運算符的定義。

#include <iostream>
#include <compare>struct Point {int x, y;auto operator<=>(const Point&) const = default;  // 自動生成所有比較運算符
};int main() {Point p1{1, 2}, p2{2, 3};std::cout << (p1 < p2) << "\n";  // 輸出: 1 (true)
}

6. constexpr 關鍵字增強

C++20 允許 constexpr 函數包含 try-catch 語句和動態內存分配。

#include <vector>constexpr int sum(const std::vector<int>& v) {int total = 0;for (int n : v) total += n;return total;
}int main() {constexpr std::vector<int> v = {1, 2, 3, 4, 5};static_assert(sum(v) == 15);
}

7. 模塊(Modules)

C++20 引入模塊化機制,減少 #include 依賴,提高編譯速度。

// mymodule.cpp
export module mymodule;
export int add(int a, int b) { return a + b; }// main.cpp
import mymodule;
#include <iostream>int main() {std::cout << add(3, 4) << "\n";  // 輸出: 7
}

8. std::jthread(自動管理的線程)

C++20 引入 std::jthread,在析構時自動 join() 線程,防止資源泄露。

#include <thread>
#include <iostream>int main() {std::jthread t([] { std::cout << "Running in thread\n"; });
}  // `t` 自動 `join()`,無需手動管理

9. std::bit_cast(高效的類型轉換)

std::bit_cast<T>(value) 用于無損轉換 POD 類型,無額外開銷。

#include <bit>
#include <iostream>int main() {float f = 3.14f;int i = std::bit_cast<int>(f);std::cout << i << "\n";  // 按位轉換,無額外開銷
}

10. std::format(格式化字符串)

類似 printf 的格式化 API,但更安全。

#include <format>
#include <iostream>int main() {std::cout << std::format("Hello, {}!", "world") << "\n";  // 輸出: Hello, world!
}

11. std::ranges::views::zip(打包多個容器)

C++20 提供 std::ranges::views::zip 讓多個容器同步迭代。

#include <ranges>
#include <vector>
#include <iostream>int main() {std::vector<int> a = {1, 2, 3};std::vector<std::string> b = {"one", "two", "three"};for (auto [x, y] : std::views::zip(a, b)) {std::cout << x << " -> " << y << "\n";}
}

12. std::stop_token(線程取消機制)

C++20 引入 std::stop_token,用于安全地取消線程。

#include <iostream>
#include <thread>
#include <stop_token>void task(std::stop_token st) {while (!st.stop_requested()) {std::cout << "Working...\n";std::this_thread::sleep_for(std::chrono::milliseconds(500));}
}int main() {std::jthread t(task);std::this_thread::sleep_for(std::chrono::seconds(2));t.request_stop();  // 取消線程
}

總結

C++20 是 C++11 以來最重要的一次更新,新增的特性大大提升了代碼的 可讀性、可維護性性能,主要包括:

  • 更好的模板編程:概念 (concepts)、if constexpr
  • 更現代的 STLstd::spanstd::formatstd::ranges
  • 更優雅的多線程支持std::jthreadstd::stop_token
  • 協程 (coroutines):支持 co_await 語法
  • 編譯速度優化:模塊 (modules)

C++20 提供了更現代化的編程方式,使開發更加 高效、安全,是值得學習和使用的版本!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/75944.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/75944.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/75944.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++中常用的十大排序方法之4——希爾排序

成長路上不孤單&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【&#x1f60a;///計算機愛好者&#x1f60a;///持續分享所學&#x1f60a;///如有需要歡迎收藏轉發///&#x1f60a;】 今日分享關于C中常用的排序方法之4——希爾排序的相…

詳細描述以太坊的gas、gaslimit、gasPrice

目錄 一、Gas 是什么? ? 簡要定義: ?? 舉例理解: 二、Gas Limit 是什么? ? 簡要定義: 分兩種: 舉例說明: 三、Gas Price 是什么? ? 簡要定義: 為什么它重要? 示例: 四、 EIP-1559 后的新機制(倫敦升級) 三個要素: 五、額外技巧(開發實用) 本文…

全國大學生數學建模競賽賽題深度分析報告(2010-2024)

全國大學生數學建模競賽賽題深度分析報告&#xff08;2010-2024&#xff09; 全國大學生數學建模競賽(CUMCM)是中國最具影響力的大學生科技競賽之一&#xff0c;本報告將對2010-2024年間的賽題進行全面統計分析&#xff0c;包括題目類型、領域分布、模型方法等多個維度&#x…

從獎勵到最優決策:動作價值函數與價值學習

從獎勵到最優決策&#xff1a;動作價值函數與價值學習 價值學習一、動作價值函數對 U t U_t Ut?求期望得到動作價值函數動作價值函數的意義最優動作價值函數(Optimal Action-Value Function)如何理解 Q ? Q^* Q?函數 二、價值學習的基本思想Deep Q-Network(DQN)DQN玩游戲的具…

智能手表該存什么音頻和文本?場景化存儲指南

文章目錄 為什么需要“場景化存儲”&#xff1f;智能手表的定位手機替代不了的場景碎片化的場景存儲 音頻篇&#xff1a;智能手表該存什么音樂和音頻&#xff1f;運動場景通勤場景健康場景 文本篇&#xff1a;哪些文字信息值得放進手表&#xff1f;&#xff08;部分情況可使用圖…

液態神經網絡技術指南

一、引言 1.從傳統神經網絡到液態神經網絡 神經網絡作為深度學習的核心工具&#xff0c;在圖像識別、自然語言處理、推薦系統等領域取得了巨大成功。尤其是卷積神經網絡&#xff08;CNN&#xff09;、循環神經網絡&#xff08;RNN&#xff09;、長短期記憶網絡&#xff08;LS…

hive通過元數據庫刪除分區操作步驟

刪除分區失敗&#xff1a; alter table proj_60_finance.dwd_fm_ma_kpi_di_mm drop partition(year2025,month0-3,typeADJ); 1、查詢分區的DB_ID、TBL_ID – 獲取數據庫ID-26110 SELECT DB_ID FROM DBS WHERE NAME ‘proj_60_finance’; – 獲取表ID-307194 SELECT TBL_ID FR…

1990-2019年各地級市GDP數據

1990-2019年各地級市GDP數據 1、時間&#xff1a;1990-2019年 2、來源&#xff1a;城市年鑒 3、指標&#xff1a;行政區劃代碼、年份、省份、城市、經度、緯度、地區生產總值(萬元) 4、范圍&#xff1a;250地級市 5、指標解釋&#xff1a;地區生產總值&#xff08;Gross R…

滄州鐵獅子

又名“鎮海吼”&#xff0c;是中國現存年代最久、形體最大的鑄鐵獅子&#xff0c;具有深厚的歷史文化底蘊和獨特的藝術價值。以下是關于滄州鐵獅子的詳細介紹&#xff1a; 歷史背景 ? 鑄造年代&#xff1a;滄州鐵獅子鑄造于后周廣順三年&#xff08;953年&#xff09;&#…

《Java八股文の文藝復興》第十一篇:量子永生架構——對象池的混沌邊緣(終極試煉·完全體)

Tags: - Java高并發 - 量子架構 - 混沌工程 - 賽博修真 - 三體防御 目錄&#xff1a; 卷首語&#xff1a;蝴蝶振翅引發的量子海嘯 第一章&#xff1a;混沌初開——對象池的量子涅槃&#xff08;深度擴展&#xff09; 第二章&#xff1a;混沌計算——對象復活的降維打擊&…

Java面試34-Kafka的零拷貝原理

在實際應用中&#xff0c;如果我們需要把磁盤中的某個文件內容發送到遠程服務器上&#xff0c;那么它必須要經過幾個拷貝的過程&#xff1a; 從磁盤中讀取目標文件內容拷貝到內核緩沖區CPU控制器再把內核緩沖區的數據復制到用戶空間的緩沖區在應用程序中&#xff0c;調用write…

TF-IDF忽略詞序問題思考

自從開始做自然語言處理的業務&#xff0c;TF-IDF就是使用很頻繁的文本特征技術&#xff0c;他的優點很多&#xff0c;比如&#xff1a;容易理解&#xff0c;不需要訓練&#xff0c;提取效果好&#xff0c;可以給予大規模數據使用&#xff0c;總之用的很順手&#xff0c;但是人…

SQL122 刪除索引

alter table examination_info drop index uniq_idx_exam_id; alter table examination_info drop index full_idx_tag; 描述 請刪除examination_info表上的唯一索引uniq_idx_exam_id和全文索引full_idx_tag。 后臺會通過 SHOW INDEX FROM examination_info 來對比輸出結果。…

Langchat平臺知識庫測試

平臺介紹&#xff1a; LangChat是Java生態下企業級AIGC項目解決方案&#xff0c;集成RBAC和AIGC大模型能力&#xff0c;幫助企業快速定制AI知識庫、企業AI機器人。 支持的AI大模型&#xff1a;Gitee AI / 阿里通義 / 百度千帆 / DeepSeek / 抖音豆包 / 智譜清言 / 零一萬物 /…

Vue3 Composition API 深度開發指南

Vue3 Composition API 深度開發指南 響應式系統核心解析 1.1 響應式原理解構 Vue3 基于 Proxy 實現響應式追蹤&#xff0c;其核心流程為&#xff1a; const reactiveHandler {get(target, key, receiver) {track(target, key) // 依賴收集return Reflect.get(target, key, …

基于自回歸模型的酒店評論生成

《DeepSeek大模型高性能核心技術與多模態融合開發&#xff08;人工智能技術叢書&#xff09;》(王曉華)【摘要 書評 試讀】- 京東圖書 我們使用新架構的模型完成情感分類&#xff0c;可以看到&#xff0c;使用注意力機制可以很好地對特征進行抽取從而完成二分類的情感分類任務…

關于轉置卷積

&#x1f9e0; 具體講解神經網絡中的轉置卷積&#xff08;Transposed Convolution&#xff09; &#x1f9ed; 1. 轉置卷積的動機&#xff1a;為什么我們需要它&#xff1f; 標準卷積通常會降低特征圖的空間尺寸&#xff08;比如從 64x64 → 32x32&#xff09;&#xff0c;這對…

JavaScript 模塊化詳解( CommonJS、AMD、CMD、ES6模塊化)

一.CommonJS 1.概念 CommonJS 規范概述了同步聲明依賴的模塊定義。這個規范主要用于在服務器端實現模塊化代碼組 織&#xff0c;但也可用于定義在瀏覽器中使用的模塊依賴。CommonJS 模塊語法不能在瀏覽器中直接運行&#xff1b;在瀏覽器端&#xff0c;模塊需要提前編譯打包處理…

TCP BBR 的優化

前段時間&#xff0c;老板發了篇資料&#xff0c;下面是我學習的相關記錄整理。 https://aws.amazon.com/cn/blogs/china/talking-about-network-optimization-from-the-flow-control-algorithm/ PS&#xff1a;ubuntu24默認使用的tcp控制算法。還是 cubic sysctl net.ipv4.tc…

什么是異步?

什么是異步&#xff1f; 異步是一個術語&#xff0c;用于描述不需要同時行動或協調就能獨立運行的流程。這一概念在技術和計算領域尤為重要&#xff0c;它允許系統的不同部分按自己的節奏運行&#xff0c;而無需等待同步信號或事件。在區塊鏈技術中&#xff0c;異步是指網絡中…