C++17 新特性簡解

C++17 新特性簡解


一、核心語言特性
1. 結構化綁定(Structured Bindings)

用途:解構復合類型(如元組、結構體)為獨立變量
示例

#include <iostream>
#include <tuple>int main() {// 解構 std::pairstd::pair<int, double> p{42, 3.14};auto [x, y] = p;std::cout << "Pair: " << x << ", " << y << "\n";// 解構結構體struct Point { int a; int b; };Point pt{10, 20};auto& [a, b] = pt; // 引用綁定a = 100;std::cout << "Point: " << pt.a << ", " << pt.b << "\n";return 0;
}
2. if/switch 初始化語句

用途:在條件語句中聲明臨時變量,限制作用域
示例

#include <iostream>
#include <vector>int getValue() { return 42; }int main() {std::vector<int> vec{1, 2, 3};// if 初始化if (auto it = std::find(vec.begin(), vec.end(), 2); it != vec.end()) {std::cout << "Found: " << *it << "\n";}// switch 初始化switch (int key = getValue(); key) {case 42: std::cout << "Answer\n"; break;default: break;}return 0;
}
3. 內聯變量(Inline Variables)

用途:允許頭文件中直接定義全局變量
示例

// header.h
inline int globalCount = 0; // 多文件包含安全struct MyClass {inline static int instanceCount = 0; // 類內初始化靜態成員
};// main.cpp
#include <iostream>
#include "header.h"int main() {MyClass::instanceCount++;std::cout << "Global: " << globalCount << ", Instance: " << MyClass::instanceCount << "\n";return 0;
}
4. 折疊表達式(Fold Expressions)

用途:簡化可變參數模板展開
示例

#include <iostream>template<typename... Args>
auto sum(Args... args) {return (args + ...); // 折疊求和
}int main() {std::cout << "Sum: " << sum(1, 2, 3, 4) << "\n"; // 輸出 10return 0;
}
5. 類模板參數推導(CTAD)

用途:自動推導模板參數類型
示例

#include <vector>
#include <tuple>int main() {std::pair p{1, "hello"};    // 推導為 pair<int, const char*>std::vector v{1, 2, 3};     // 推導為 vector<int>std::tuple t{4, 3.14, "π"}; // 推導為 tuple<int, double, const char*>return 0;
}
6. constexpr 擴展

用途:支持更多編譯期計算
示例

#include <iostream>constexpr int factorial(int n) {if (n <= 1) return 1;return n * factorial(n - 1);
}int main() {constexpr int val = factorial(5);static_assert(val == 120); // 編譯期驗證std::cout << "5! = " << val << "\n";return 0;
}

二、標準庫增強
1. 文件系統庫(Filesystem)

頭文件<filesystem>
示例

#include <iostream>
#include <filesystem>namespace fs = std::filesystem;int main() {fs::path p = fs::current_path() / "test.txt";if (fs::exists(p)) {std::cout << "文件大小: " << fs::file_size(p) << "字節\n";}return 0;
}
2. 新容器類型
類型用途示例代碼
std::optional<T>表示可能不存在的值[見下方]
std::variant<T...>類型安全的聯合體[見下方]
std::any存儲任意類型[見下方]
std::string_view非擁有字符串視圖[見下方]

完整示例

#include <iostream>
#include <optional>
#include <variant>
#include <any>
#include <string_view>int main() {// optionalstd::optional<int> opt = 42;if (opt) std::cout << "Optional: " << *opt << "\n";// variantstd::variant<int, std::string> v = "hello";std::cout << "Variant: " << std::get<std::string>(v) << "\n";// anystd::any a = 3.14;if (a.type() == typeid(double)) {std::cout << "Any: " << std::any_cast<double>(a) << "\n";}// string_viewstd::string_view sv = "Hello World";std::cout << "View: " << sv.substr(0, 5) << "\n";return 0;
}
3. 并行算法

頭文件<execution>
示例

#include <iostream>
#include <vector>
#include <algorithm>
#include <execution>int main() {std::vector<int> data{5, 3, 1, 4, 2};// 并行排序std::sort(std::execution::par, data.begin(), data.end());// 并行遍歷std::for_each(std::execution::par, data.begin(), data.end(), [](int x) {std::cout << x << " ";});return 0;
}

三、其他改進
1. 嵌套命名空間簡化
namespace A::B::C { // 等價于 namespace A { namespace B { namespace C {class MyClass {};
}}int main() {A::B::C::MyClass obj;return 0;
}
2. 強制復制省略
struct NonCopyable {NonCopyable() = default;NonCopyable(const NonCopyable&) = delete;
};NonCopyable create() {return NonCopyable{}; // C++17 必須省略拷貝
}int main() {NonCopyable obj = create();return 0;
}
3. 新增屬性
[[nodiscard]] int critical() { return 42; }int main() {critical(); // 警告:返回值未使用return 0;
}

四、完整可編譯代碼示例
#include <iostream>
#include <tuple>
#include <vector>
#include <filesystem>
#include <optional>
#include <algorithm>
#include <execution>// 結構化綁定
void demo_structured_binding() {auto [x, y] = std::make_tuple(42, 3.14);std::cout << "Tuple: " << x << ", " << y << "\n";
}// 文件系統
void demo_filesystem() {namespace fs = std::filesystem;fs::path p = fs::current_path();std::cout << "當前路徑: " << p << "\n";
}// 并行算法
void demo_parallel() {std::vector<int> data{5, 3, 1, 4, 2};std::sort(std::execution::par, data.begin(), data.end());for (int n : data) std::cout << n << " ";
}int main() {demo_structured_binding();demo_filesystem();demo_parallel();return 0;
}

五、編譯與運行
  1. 編譯命令
    g++ -std=c++17 -o cpp17_demo cpp17_demo.cpp -lstdc++fs
    

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

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

相關文章

PHP使用pandoc把markdown文件轉為word

文章目錄 首先安裝pandocPHP處理 服務器操作系統是Linux&#xff0c;centos 首先安裝pandoc yum install -y pandoc安裝完成后輸入如下代碼&#xff0c;檢查安裝是否成功 pandoc --versionPHP處理 我把markdown內容存到了數據庫里&#xff0c;所以要從數據庫讀取內容。對內容…

【Python學習筆記】Pandas實現Excel質檢記錄表初審、復核及質檢統計

背景&#xff1a; 我有這樣一個需要審核的飛書題目表&#xff0c;按日期分成多個sheet&#xff0c;有初審——復核——質檢三個環節&#xff0c;這三個環節是不同的同學在作業&#xff0c;并且領到同一個題目的人選是隨機的&#xff0c;也就是說&#xff0c;完成一道題的三個人…

守護進程編程、GDB調試以及外網連接樹莓派

目錄 一、什么是守護進程以及如何創建守護進程1. 什么是守護進程&#xff1f;2. 如何創建守護進程&#xff1f; 二、什么是GDB調試以及如何用GDB命令調試C程序1. 什么是GDB&#xff1f;2. 如何用GDB命令調試C程序&#xff1f; 三、外網訪問樹莓派 一、什么是守護進程以及如何創…

Logisim數字邏輯實訓——計數器設計與應用

4位遞增計數器 六進制計數器 十進制計數器 六十進制計數器 二十四進制計數器 計時器

發現“橫”字手寫有難度,對比兩個“橫”字

我發現手寫體“橫”字“好看”程度&#xff0c;難以比得上印刷體&#xff1a; 兩個從方正簡體啟體來的“橫”字&#xff1a; 哪個更好看&#xff1f;我是傾向于左邊一點。 <div style"transform: rotate(180deg); display: inline-block;"> 左邊是我從方正簡…

ubuntu 向右拖動窗口后消失了、找不到了

這是目前單顯示器的設置&#xff0c;因為實際只有1個顯示器&#xff0c;之前的設置如下圖所示&#xff0c;有2個顯示器&#xff0c;一個主顯示器&#xff0c;一個23寸的顯示器 ubuntu 22.04 系統 今天在操作窗口時&#xff0c;向右一滑&#xff0c;發現這個窗口再也不顯示了、找…

專精特新政策推動,B端UI設計如何賦能中小企業創新發展?

在當前數字化轉型浪潮下&#xff0c;專精特新政策為中小企業提供了強大的支持&#xff0c;助力其在細分領域實現專業化、精細化、特色化和創新化發展。B端UI設計作為提升企業數字化產品用戶體驗和工作效率的重要手段&#xff0c;能夠有效賦能中小企業創新發展。本文將探討專精特…

梯度下降代碼

整體流程 數據預處理:標準化->加一列全為1的偏置項 訓練:梯度下降,將數學公式轉換成代碼 預測 模型代碼 import numpy as np# 標準化函數&#xff1a;對特征做均值-方差標準化 # 返回標準化后的特征、新數據的均值和標準差&#xff0c;用于后續預測def standard(feats…

RAG 實戰|用 StarRocks + DeepSeek 構建智能問答與企業知識庫

文章作者&#xff1a; 石強&#xff0c;鏡舟科技解決方案架構師 趙恒&#xff0c;StarRocks TSC Member &#x1f449; 加入 StarRocks x AI 技術討論社區 https://mp.weixin.qq.com/s/61WKxjHiB-pIwdItbRPnPA RAG 和向量索引簡介 RAG&#xff08;Retrieval-Augmented Gen…

從零開始學A2A一:A2A 協議的高級應用與優化

A2A 協議的高級應用與優化 學習目標 掌握 A2A 高級功能 理解多用戶支持機制掌握長期任務管理方法學習服務性能優化技巧 理解與 MCP 的差異 分析多智能體場景下的優勢掌握不同場景的選擇策略 第一部分&#xff1a;多用戶支持機制 1. 用戶隔離架構 #mermaid-svg-Awx5UVYtqOF…

【C++】入門基礎【上】

目錄 一、C的發展歷史二、C學習書籍推薦三、C的第一個程序1、命名空間namespace2、命名空間的使用3、頭文件<iostream>是干什么的&#xff1f; 個人主頁<—請點擊 C專欄<—請點擊 一、C的發展歷史 C的起源可以追溯到1979年&#xff0c;當時Bjarne Stroustrup(本…

1panel第三方應用商店(本地商店)配置和使用

文章目錄 引言資源網站實戰操作說明 引言 1Panel 提供了一個應用提交開發環境&#xff0c;開發者可以通過提交應用的方式將自己的應用推送到 1Panel 的應用商店中&#xff0c;供其他用戶使用。由此衍生了一種本地應用商店的概念&#xff0c;用戶可以自行編寫應用配置并上傳到自…

Evidential Deep Learning和證據理論教材的區別(主要是概念)

最近終于徹底搞懂了Evidential Deep Learning&#xff0c;之前有很多看不是特別明白的地方&#xff0c;原來是和證據理論教材&#xff08;是的&#xff0c;不只是國內老師寫的&#xff0c;和國外的老師寫的教材出入也比較大&#xff09;的說法有很多不一樣&#xff0c;所以特地…

text-decoration: underline;不生效

必須得紀念一下&#xff0c;在給文本加下劃線時&#xff0c;發現在win電腦不生效&#xff0c;部分mac也不生效&#xff0c;只有個別的mac生效了&#xff0c;思考了以下幾種方面&#xff1a; 1.兼容性問題&#xff1f; 因為是electron項目&#xff0c;不存在瀏覽器兼容性問題&…

VUE SSR(服務端渲染)

&#x1f916; 作者簡介&#xff1a;水煮白菜王&#xff0c;一位前端勸退師 &#x1f47b; &#x1f440; 文章專欄&#xff1a; 前端專欄 &#xff0c;記錄一下平時在博客寫作中&#xff0c;總結出的一些開發技巧和知識歸納總結?。 感謝支持&#x1f495;&#x1f495;&#…

ARCGIS國土超級工具集1.5更新說明

ARCGIS國土超級工具集V1.5版本更新說明&#xff1a;因作者近段時間工作比較忙及正在編寫ARCGISPro國土超級工具集&#xff08;截圖附后&#xff09;的原因&#xff0c;故本次更新為小更新&#xff08;沒有增加新功能&#xff0c;只更新了已有的工具&#xff09;。本次更新主要修…

劉鑫煒履新共工新聞社新媒體研究院院長,賦能媒體融合新征程

2025年4月18日&#xff0c;大灣區經濟網戰略媒體共工新聞社正式對外宣布一項重要人事任命&#xff1a;聘任螞蟻全媒體總編劉鑫煒為新媒體研究院第一任院長。這一舉措&#xff0c;無疑是對劉鑫煒在新媒體領域卓越專業能力與突出行業貢獻的又一次高度認可&#xff0c;也預示著共工…

java基礎從入門到上手(九):Java - List、Set、Map

一、List集合 List 是一種用于存儲有序元素的集合接口&#xff0c;它是 java.util 包中的一部分&#xff0c;并且繼承自 Collection 接口。List 接口提供了多種方法&#xff0c;用于按索引操作元素&#xff0c;允許元素重復&#xff0c;并且保持插入順序。常用的 List 實現類包…

UWP發展歷程

通用Windows平臺(UWP)發展歷程 引言 通用Windows平臺(Universal Windows Platform, UWP)是微軟為實現"一次編寫&#xff0c;處處運行"的愿景而打造的現代應用程序平臺。作為微軟統一Windows生態系統的核心戰略組成部分&#xff0c;UWP代表了從傳統Win32應用向現代應…

git忽略已跟蹤的文件/指定文件

在項目開發中&#xff0c;有時候我們并不需要git跟蹤所有文件&#xff0c;而是需要忽略掉某些指定的文件或文件夾&#xff0c;怎么操作呢&#xff1f;我們分兩種情況討論&#xff1a; 1. 要忽略的文件之前并未被git跟蹤 這種情況常用的方法是在項目的根目錄下創建和編輯.gitig…