C++14 到 C++20 全面解析:語言新特性、標準庫演進與實戰案例

一、前言

C++ 作為一門歷史悠久且不斷演進的編程語言,在 C++11 之后進入了“現代化”的快車道。C++11 被稱為 C++ 的第二次誕生,引入了 lambda 表達式、智能指針、右值引用、并發支持等革命性特性。

然而,C++ 的標準化進程并沒有止步于此。C++14、C++17 和 C++20 在 C++11 的基礎上不斷改進,不僅增強了語言本身的表達能力,還提升了標準庫的實用性和性能。尤其是 C++20,被稱為 繼 C++11 之后最大的一次升級,引入了 Concepts、Ranges、協程(Coroutines)等重量級特性,幾乎把 C++ 推向了一個新的高度。

本文將全面梳理 C++14 到 C++20 的語言與庫特性,并配合實例進行講解,幫助開發者快速理解這些版本的演進方向與實際應用場景。


二、C++14 新特性

雖然 C++14 相比 C++11 的變化不算大,但它起到了 平滑過渡 的作用,修復了 C++11 的一些不足,同時引入了一些語法糖和小而美的改進。

1. 泛型 lambda(Generic Lambdas)

在 C++11 中,lambda 的參數必須指定具體類型;C++14 開始允許使用 auto 作為參數類型:

#include <iostream> int main() { auto lambda = [](auto x, auto y) { return x + y; }; std::cout << lambda(1, 2) << std::endl; // int std::cout << lambda(1.5, 2.3) << std::endl; // double }

👉 意義:使 lambda 更加靈活,提升泛型編程能力。


2. 返回值類型推導(Return Type Deduction)

C++14 支持函數返回值使用 auto 自動推導:

auto add(int a, int b) { return a + b; // 自動推導為 int }

👉 優點:減少模板編程時的冗余代碼。


3. 二進制字面量與數字分隔符

int bin = 0b1010; // 二進制 10 int large = 1'000'000; // 使用單引號分隔,提高可讀性


4. std::make_unique

C++11 中只有 make_shared,而 make_unique 直到 C++14 才被引入,避免了顯式 new

auto ptr = std::make_unique<int>(42);


5. constexpr 擴展

C++14 放寬了 constexpr 的限制,允許其包含局部變量和分支語句,使其更貼近常規函數。


小結

C++14 可以看作 C++11 的語法補全和體驗優化版本,為后續 C++17 和 C++20 鋪路。


三、C++17 新特性

C++17 被認為是 繼 C++11 之后又一次實用性的重大更新,它不僅增強了語言特性,還大幅擴展了標準庫。

1. 結構化綁定(Structured Bindings)

#include <tuple> #include <iostream> std::tuple<int, double, std::string> foo() { return {1, 2.5, "hello"}; } int main() { auto [a, b, c] = foo(); std::cout << a << ", " << b << ", " << c << std::endl; }

👉 意義:讓代碼更簡潔,替代 std::tie


2. ifswitch 初始化語句

if (auto it = map.find(key); it != map.end()) { std::cout << it->second << std::endl; }

👉 意義:縮小變量作用域,提高代碼可讀性。


3. 內聯變量(Inline Variables)

允許在頭文件中定義全局常量,而不會導致多重定義錯誤:

struct Config { static inline const int max_value = 100; };


4. 折疊表達式(Fold Expressions)

簡化可變參數模板的展開:

template<typename... Args> auto sum(Args... args) { return (args + ...); // 一元右折疊 }


5. std::optional

用于表示可能存在也可能不存在的值:

std::optional<int> getValue(bool ok) { if (ok) return 42; return std::nullopt; }


6. std::variantstd::visit

類型安全的聯合體:

std::variant<int, std::string> v = "hello"; std::visit([](auto&& arg) { std::cout << arg; }, v);


7. std::any

保存任意類型的對象:

std::any a = 42; std::cout << std::any_cast<int>(a) << std::endl;


8. 并行 STL(Parallel STL)

C++17 引入并行執行策略,加速標準庫算法:

#include <execution> #include <vector> #include <algorithm> std::vector<int> v(1000000, 1); std::sort(std::execution::par, v.begin(), v.end());


小結

C++17 提升了 表達力庫的實用性,很多項目開始廣泛使用。


四、C++20 新特性

C++20 被認為是繼 C++11 之后最大的升級,幾乎可以稱為 現代 C++2.0

1. Concepts(概念)

為模板參數增加約束,提升可讀性和錯誤提示:

#include <concepts> template <typename T> requires std::integral<T> T add(T a, T b) { return a + b; }


2. Ranges(范圍庫)

簡化對容器的處理:

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


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 foo() { std::cout << "Hello "; co_await std::suspend_always{}; std::cout << "World\n"; } int main() { foo(); }


4. 模塊(Modules)

替代頭文件的機制,改善編譯速度:

// math.ixx export module math; export int add(int a, int b) { return a + b; } // main.cpp import math; #include <iostream> int main() { std::cout << add(1, 2); }


5. constexpr 擴展

C++20 幾乎允許在 constexpr 中編寫完整的邏輯,包括動態分配。


6. span

表示一段連續的內存:

#include <span> #include <vector> #include <iostream> void print(std::span<int> s) { for (auto v : s) std::cout << v << " "; } int main() { std::vector<int> v = {1, 2, 3}; print(v); }


7. 其他改進

  • 三路比較運算符 <=>(太空船運算符)

  • constexprstd::vectorstd::string

  • 新的 chrono 擴展(時區支持)


五、C++14/17/20 對比總結

特性類別C++14C++17C++20
Lambda泛型捕獲改進更強 constexpr
模板auto 返回折疊表達式Concepts
庫擴展make_uniqueoptional/variant/anyranges/span
并發-并行 STL協程
語法糖二進制字面量結構化綁定模塊/太空船運算符

👉 結論:

  • C++14:小修小補,過渡版本

  • C++17:實用增強,適合大規模工程

  • C++20:革命性升級,開啟現代 C++ 新篇章


六、實際應用案例

異步網絡編程 為例,分別用不同版本實現:

  • C++14:需要手寫回調或 future

  • C++17:結合 std::optional 和并行 STL 優化邏輯

  • C++20:直接用 協程 + ranges 實現優雅的異步數據流處理

代碼示例(C++20 協程版):

#include <coroutine> #include <iostream> #include <string> 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 asyncFetch(std::string url) { std::cout << "Fetching: " << url << std::endl; co_await std::suspend_always{}; std::cout << "Done: " << url << std::endl; } int main() { asyncFetch("https://example.com"); }


七、總結

C++14 的語法糖,到 C++17 的大幅實用擴展,再到 C++20 的革命性升級,C++ 逐步完成了向現代語言的轉變。

  • C++14:打磨細節,讓 C++11 更易用。

  • C++17:增強工程實用性,引入 optional、variant、并行 STL。

  • C++20: Concepts、Ranges、Modules、Coroutines,標志著 C++ 進入新時代。

對于開發者來說:

  • 如果項目追求穩定性,C++17 足夠

  • 如果項目追求新特性和高性能,C++20 值得嘗試

未來的 C++23、C++26 還將繼續擴展,但 C++20 已經足夠成為現代 C++ 的代表性版本。

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

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

相關文章

HarvardX TinyML小筆記2(番外1:TFLite)

1 原理 tflite就是Tensorflow的輕量化模型&#xff0c;核心處理就是量化和剪枝。不過這部分目前是在Tensorflow中封裝了&#xff0c;所以這里也不會去看細節&#xff0c;主要就是看看原理和使用方法。 量化Quantization&#xff0c;其實就是把原來的float32換成int8。這樣一個…

向量庫Qdrant vs Milvus 系統詳細對比

Qdrant vs Milvus 系統詳細對比 一、它們是什么&#xff08;定位&#xff09; 兩者都是專門做向量相似搜索的數據庫&#xff1a;支持ANN&#xff08;近似最近鄰&#xff09;檢索、向量結構化過濾、REST/gRPC 接口與官方SDK&#xff1b;Milvus 官方也定位為"面向GenAI、可…

適配歐拉操作系統

背景 客戶指定服務器環境歐拉操作系統&#xff0c;版本&#xff1a;6.6.0-72.0.0.76.oe2403sp1.x86_64 需要把Java 應用以及各種中間件部署在歐拉操作系統上。 問題適配MySQL 1.1 編譯報錯 mysql-5.7.40-el7-x86_64.tar.gz版本在CentOS7環境安裝正常 當前歐拉環境直接使用CentO…

學習spring Bean的生命周期

完整項目結構 ├── pom.xml └── src/├── main/│ ├── java/│ │ └── com/│ │ └── zhang/│ │ ├── bean/│ │ │ ├── Address.java│ │ │ ├── MyBeanPostProcessor.java│ │ …

elasticsearch 7.17.23 使用spring data es實現高亮分頁,scroll查詢分頁查詢

一 介紹 1.1 工程結構 1.2 啟動elasticsearch服務 1.3 高亮分頁 DeepSeek 代碼 效果&#xff1a; 1.4 scroll分頁 代碼 2.效果 后臺日志 1.5 完整代碼 https://gitee.com/jurf-liu/es-2.17.x-demo.git

onlyoffice整合springboot+vue實現文檔在線編輯保存

項目上需要用到在線word、excel文檔編輯功能&#xff0c;通過游覽器在線打開一個遠程的word文檔編輯保存&#xff0c;這里記錄下整合思路。 onlyoffice簡介 ONLYOFFICE 是一款開源的辦公套件&#xff0c;提供了一系列在線文檔編輯和協作工具&#xff0c;適用于團隊和個人使用…

Linux筆記10——shell編程基礎-4

補充$#——取參數個數“$n”,有值取值&#xff0c;無值取空字符&#xff0c;一般都會加引號&#xff0c;在某些情況下避免報語法錯誤一、read接收鍵盤輸入[rootlocalhost ~]# cat demo.sh #!/bin/bash echo -n "請輸入你的姓名&#xff1a;" read nameecho "你…

(Redis)過期刪除策略

1. 背景Redis 支持為 Key 設置過期時間&#xff08;TTL&#xff09;&#xff0c;讓數據在一定時間后自動失效。 例如&#xff1a;SET session:1001 "userA" EX 60 # 60 秒后過期但是問題來了&#xff1a;Key 到期后&#xff0c;Redis 什么時候、如何刪除它&#xf…

nodejs 集成mongodb實現增刪改查

初始化項目: npm init -y npm install mongoose -save 安裝mongoose 插件 mongoose 鏈接數據庫語法&#xff1a; mongodb://[username:password]host1[:poert1],host2[:port2]…/[databsase]?[options…] userame&#xff1a; 用戶名 passwrod: 密碼 host1:port1,host2:port…

音視頻學習(五十八):STAP-A模式

什么是 STAP-A&#xff1f; STAP-A 是一種特殊的 RTP 封裝機制&#xff0c;專為 H.264 和 H.265 這類視頻編碼協議設計。它的核心目的只有一個&#xff1a;將多個小的 NALU&#xff08;網絡抽象層單元&#xff09;打包進一個 RTP 包中&#xff0c;以此來減少網絡開銷&#xff0…

管理型交換機通過VLAN劃分實現不同IP跨網段通信配置方法

管理型交換機應用場景豐富&#xff0c;如果要實現不同IP跨網段通信(比如172.22.106.X和192.168.100.X實現通信)&#xff0c;通過VLAN劃分是可以滿足&#xff0c;下面分享基于弱三層交換機RTL9301方案核心模塊SW-24G4F-301EM配置方法&#xff01; 1. 一般結合交換機的應用場景&a…

什么是高防服務器?如何進行防御?

高防服務器是指能為用戶提供防御網絡攻擊&#xff0c;是主要針對DDOS等流量型攻擊能力的服務器&#xff0c;通過部署專業的硬件設備與軟件系統&#xff0c;具備高帶寬、大流量清洗能力&#xff0c;能有效抵御各類惡意流量沖擊&#xff0c;確保服務器穩定運行&#xff0c;保障網…

SW - 增加導出STL數據中的三角面數,增加別人逆向建模的難度

文章目錄SW - 增加導出STL數據中的三角面數&#xff0c;增加別人逆向建模的難度概述筆記SW版本導出時&#xff0c;選擇STL的導出選項默認導出(精細)導出粗糙自定義導出 - 將誤差和角度改為最大自定義導出 - 將誤差,角度,三角面數改為最大備注這幾天的感想關于我不參考人家零件&…

四十一、【高級特性篇】API 文檔驅動:OpenAPI/Swagger 一鍵導入測試用例

四十一、【高級特性篇】API 文檔驅動:OpenAPI/Swagger 一鍵導入測試用例 前言 準備工作 第一部分:后端實現 - OpenAPI 解析與批量創建 API 1. 創建 OpenAPI 解析服務 2. 創建批量用例導入 API 3. 注冊新 API 路由 第二部分:前端實現 - OpenAPI 導入界面 1. 更新 `api/testca…

K8S-Service資源對象

一、概述在kubernetes中&#xff0c;pod是應用程序的載體&#xff0c;我們可以通過pod的ip來訪問應用程序&#xff0c;但是pod的ip地址不是固定的&#xff0c;這也就意味著不方便直接采用pod的ip對服務進行訪問。為了解決這個問題&#xff0c;kubernetes提供了Service資源&…

【STM32】CubeMX(十三):RT-THREAD

本篇博客描述的是 RT-Thread STM32 CubeMX 的使用方法。本文也為大家提供了基于 STM32 使用 CubeMX 添加 RT-Thread 并創建閃爍 LED 任務 的操作流程。 便于您更好的理解。 一、RT-Thread 是什么&#xff1f; RT-Thread 是一個開源、輕量級的實時操作系統&#xff0c;適用于…

基于Ubuntu22.04系統PaddleX和PaddleClas訓練推理MMAFEDB人臉表情識別數據集(詳細教程)

目錄 基于Ubuntu22.04系統PaddleX和PaddleClas訓練推理MMAFEDB人臉表情識別數據集(詳細教程) 超實用的Paddle圖像分類訓練推理教程&#xff0c;助力深度學習研究&#xff01; 1、環境準備(重要???) 構建虛擬環境 安裝PaddlePaddle 安裝PaddleX 安裝PaddleClas插件 2…

Mistral AI音頻大模型Voxtral解讀

1. 引言 傳統的語音處理系統(如OpenAI的Whisper)在ASR任務上取得了巨大成功,能將語音高精度地轉換為文本。但這只是第一步。真正的“語音理解”意味著: 內容推理:不僅知道說了什么,還能理解話語背后的含義、情感和意圖。 長篇摘要:能夠聽完一段長達數十分鐘的播客或會議…

使用Docker+WordPress部署個人博客

一、通過docker compose 自動一鍵部署WordPress 1. 準備工作 安裝 Docker 和 Docker Compose確保服務器有公網 IP&#xff08;如果需要外部訪問&#xff09;域名&#xff08;可選&#xff0c;用于綁定網站&#xff09; 2. 創建 Docker Compose 配置文件 創建一個docker-compose…

http與https配置

Web 服務詳解&#xff1a;HTTP 與 HTTPS 配置 一、HTTP 服務概述 HTTP&#xff08;Hypertext Transfer Protocol&#xff0c;超文本傳輸協議&#xff09;是用于在網絡上傳輸網頁數據的基礎協議&#xff0c;默認使用80 端口&#xff0c;以明文形式傳輸數據。常見的 HTTP 服務軟件…