8、constexpr if、inline、類模版參數推導、lambda的this捕獲、初始化列表、namespace---c++17

一、constexpr if:編譯時條件分支

  • 作用:在模板編程中,根據條件在編譯時選擇不同的代碼路徑,無需特化版本或復雜SFINAE技巧[替代SFINAE]。[SFINAE將在模版元編程再講。下個月了。]

注意:默認使用了隱式inline

  • 基本語法
if constexpr (condition) {// 如果 condition 為 true,編譯這部分
} else {// 如果 condition 為 false,編譯這部分(可選)
}
  • condition 必須是編譯時可求值的常量表達式(如 constexpr 變量、模板參數、sizeof 等)
  • 關鍵區別:與普通 if 不同,if constexpr 在編譯時直接丟棄未選擇的分支,不會檢查語法有效性。

在這里插入圖片描述

二、inline變量:頭文件中的全局/靜態變量定義

  • 作用:允許在頭文件定義全局變量或類的靜態成員變量,避免多次定義的鏈接錯誤。
  • inline可以減少函數調用開銷,提高性能。

注意:在類定義內部直接實現的成員函數(如頭文件中的類方法)默認是 inline 的,無需顯式聲明。

  • c++17前,只能在頭文件中聲明后,cpp文件中使用。
    • extern可以用來告知已經定義過這個變量了。推薦這篇文章
  • 例子(c++17前的static 變量,需要再類的外面定義,類里面聲明)
// MyClass.h
class MyClass {
public:static int sharedValue; // 頭文件中聲明
};// MyClass.cpp
int MyClass::sharedValue = 10; // 必須在一個.cpp文件中定義
  • 而c++17后,就只需要在static變量前面加inline,就可以定義了。
// MyClass.h (C++17后)
class MyClass {
public:inline static int sharedValue = 10; // 直接初始化,無需外部定義
};// 使用:多個.cpp文件可以安全包含此頭文件

三、類模版參數推導

  • 作用:編譯器根據構造函數參數自動推導類模板類型,簡化代碼。
#include <vector>
#include <tuple>// 標準庫的CTAD:無需顯式模板參數
std::pair p(1, 3.14);        // 推導為 std::pair<int, double>
std::vector v{1, 2, 3};      // 推導為 std::vector<int>// 自定義類
template <typename T, typename U>
struct MyPair {T first;U second;MyPair(T f, U s) : first(f), second(s) {}
};// 使用CTAD
MyPair mp(5, "hello");  // 推導為 MyPair<int, const char*>// 若構造函數無法推斷類型,可添加推導指引:
template <typename T>
MyPair(T, T) -> MyPair<T, T>; // 處理MyPair(2,3)到MyPair<int, int>的推導

補充:auto占位的非類型模版形參

  • auto占位的非類型模版形參
template<auto T>
void func1(){cout<<T<<endl;
}
int main(){func1<100>();//100return 0;
}

四、lambda的this捕獲[*this]

  • 作用:按值捕獲當前對象的副本,避免捕獲this指針可能導致的對象銷毀后的懸垂引用

懸垂引用是指引用了一個已經被銷毀或無效的內存的引用變量

// C++17后:按值捕獲對象副本,安全
#include <iostream>class Worker {
public:int data = 42;void start() {// C++17前:按引用捕獲this,危險!(若對象銷毀后lambda還在運行)auto lambda_old = [this]() { std::cout << data << "\n"; // 可能的懸垂引用};// C++17后:按值捕獲對象副本,安全auto lambda_new = [*this]() mutable { data++; // 操作的是副本的datastd::cout << data << "\n"; // 輸出43};}
};

五、初始化列表

1、c++11

  • 統一初始化語法:允許用花括號 {} 初始化幾乎所有類型的對象,避免舊的 () 和 {} 混亂。
// 常見初始化方式
int arr[] = {1, 2, 3};
std::vector<int> vec = {4, 5, 6};// 聚合類(沒有自定義構造函數、無私有成員等)
struct Point { int x; int y; };
Point p = {10, 20}; // C++11允許聚合初始化// 構造函數使用初始化列表
class Widget {
public:Widget(std::initializer_list<int> list) { /*...*/ }
};
Widget w{1, 2, 3}; // 調用初始化列表構造函數
  • 注意特性:
    • 禁止窄化轉換(如 double → int):int x{3.14}; 會報錯。
    • 解決構造函數歧義:優先匹配 std::initializer_list 構造函數。
    • 支持聚合類型初始化:簡化結構體和數組的初始化。

2、c++17初始化列表增強

2.1、類模板參數推導(CTAD)支持初始化列表

// C++17前:需顯式指定模板參數
std::vector<int> v1 = {1, 2, 3};// C++17允許推導
std::vector v2{1, 2, 3}; // 推導為 vector<int>
std::pair p{42, "hello"}; // 推導為 pair<int, const char*>

2.1、聚合初始化擴展

  • 允許繼承的聚合初始化:基類可以是聚合類型。
struct Base { int a; };
struct Derived : Base { int b; };
Derived d{{1}, 2}; // C++17:基類成員先初始化

注意:基類成員先初始化

2.2、允許直接列表初始化枚舉

enum class Color { Red, Green, Blue };
Color c{1}; // C++17允許,對應Color::Green

在這里插入圖片描述

六、namespace的嵌套

  • 在c++17前,聲明namespace嵌套,是一層一層的命令。
//C++17之前
namespace A {namespace B {namespace C {void func1() {}} //namespace C} //namespace B
} //namespace A
  • c++17是可以使用作用域限定符方式簡化。
//C++17
namespace A::B::C {void func1() {}
} //namespace A::B::C

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

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

相關文章

【Java設計模式及實踐學習-第4章節-結構型模式】

第4章節-結構型模式 筆記記錄 1. 適配器模式2. 代理模式3. 裝飾器模式4. 橋接模式5. 組合模式6. 外觀模式7. 享元模式8. 總結 1. 適配器模式 2. 代理模式 3. 裝飾器模式 4. 橋接模式 5. 組合模式 6. 外觀模式 7. 享元模式 Java語言中的String字符串就使用了享元模式&…

unity基礎自學2.3:移動和抓握物品

文章目錄 前言&#xff1a;1、基礎配置①XR Interaction Toolkit②創建一個XR場景③示例文件實現④ 一鍵配置&#xff08;PICO Building Blocks&#xff09; 2、射線移動物品和抓握物品方法一&#xff1a;Grab Interactable方法二&#xff1a;prefab 3、Box Collider的作用與使…

pytest基礎-new

規范 1、首先創建 py 文件命名以 test_ 開始或者以 _test 結尾 2、若是新建類&#xff0c;測試類需要以 Test_開頭 3、測試用例&#xff08;方法&#xff09;需要以 test_開頭 assert 斷言 assert xx&#xff1a;判斷 xx 為真 assert not xx&#xff1a;判斷 xx 不為真 asse…

【華為OD機試真題】232、統計射擊比賽成績 | 機試真題+思路參考+代碼分析(C++)

題目描述 給定一個射擊比賽成績單,包含多個選手若干次射擊的成績分數,請對每個選手按其最高3個分數之和進行降序排名,輸出降序排 名后的選手ID序列 條件如下: 1.一個選手可以有多個射擊成績的分數,且次序不固定 2.如果一個選手成績少于3個,則認為選手的所有成績無效,排名…

?Unity 開發 | 如何通過 NTP 網絡時間實現精準的跨平臺時間同步【附完整源碼 + UI 模塊 + 偏差分析】

&#x1f3ae; 項目實戰 | 實現一套精確、可視化的游戲時間同步機制&#xff0c;讓你的多人在線游戲擺脫“時間不一致”噩夢&#xff01; 效果如圖&#xff1a; &#x1f4cc; 一、前言&#xff1a;為什么不能只信本地時間&#xff1f; 在 Unity 游戲開發中&#xff0c;時間幾…

Vue3 Composition API與十大組件開發案例詳解

文章目錄 一、Vue3核心API解析1.1 Composition API優勢1.2 核心API 二、十大組件開發案例案例1&#xff1a;響應式表單組件案例2&#xff1a;動態模態框&#xff08;Teleport應用&#xff09;案例3&#xff1a;可復用列表組件案例4&#xff1a;全局狀態通知組件案例5&#xff1…

Kafka 詳細解讀

1. Producer&#xff08;生產部卷王&#xff09; 職責&#xff1a;往 Kafka 里瘋狂輸出數據&#xff0c;KPI 是「日拋式消息海嘯」 職場人設&#xff1a; 白天開會畫餅&#xff0c;深夜寫周報的奮斗逼&#xff0c;口頭禪是「這個需求今晚必須上線&#xff01;」代碼里的「福報…

LicheeRV Nano 與Ubuntu官方risc-v 鏡像混合

LicheeRV Nano 官方給的鏡像并沒有unbutu, unbutu官方有一個基于 LicheeRV Dock的鏡像&#xff0c;想象能否將二者混合 &#xff08;1&#xff09;刷 LicheeRV Dock的鏡像 nano無法啟動 &#xff08;2&#xff09;將nano的boot分區替換掉 LicheeRV Dock的rootfs以外的分區也…

【模板匹配】圖像處理(OpenCV)-part10

19.1模板匹配 模板匹配就是用模板圖&#xff08;通常是一個小圖&#xff09;在目標圖像&#xff08;通常是一個比模板圖大的圖片&#xff09;中不斷的滑動比較&#xff0c;通過某種比較方法來判斷是否匹配成功,找到模板圖所在的位置。 不會有邊緣填充。 類似于卷積&#xff0c…

HTML:表格數據展示區

<!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>人員信息表</title><link rel"styl…

MySQL 的鎖,表級鎖是哪一層的鎖?行鎖是哪一層的鎖?

MySQL 的鎖層級與類型 在 MySQL 中&#xff0c;鎖的層級和實現與存儲引擎密切相關。 1. 表級鎖&#xff08;Table-Level Locks&#xff09; &#xff08;1&#xff09;存儲引擎層的表級鎖 實現層級&#xff1a;存儲引擎層&#xff08;如 MyISAM、InnoDB&#xff09;。特點&a…

阿里巴巴按圖搜索1688商品(拍立淘) API 返回值說明

阿里巴巴按圖搜索1688商品&#xff08;拍立淘&#xff09;API 返回值說明 阿里巴巴按圖搜索1688商品&#xff08;拍立淘&#xff09;API 的返回值通常以 JSON 格式返回&#xff0c;包含搜索結果、商品信息、分頁信息等。以下是具體的返回值說明&#xff1a; 1. 請求狀態信息 …

基于esp32-s3,寫一個實現json鍵值對數據創建和讀寫解析c例程

以下是一個基于 ESP32 - S3 使用 ESP - IDF 框架實現 JSON 鍵值對數據創建、讀寫和解析的 C 語言例程。 環境準備 確保你已經安裝了 ESP - IDF 開發環境&#xff0c;并且可以正常編譯和燒錄代碼到 ESP32 - S3 開發板。 代碼示例 #include <stdio.h> #include <stri…

MyBatis-Plus 使用 Wrapper 構建動態 SQL 有哪些優劣勢?

MyBatis-Plus (MP) 提供的 Wrapper (如 QueryWrapper, LambdaQueryWrapper, UpdateWrapper, LambdaUpdateWrapper) 是其核心特性之一&#xff0c;它允許我們在開發時以面向對象的方式構建 SQL 的 WHERE 條件、ORDER BY、SELECT 字段列表等部分。與傳統的 MyBatis 在 XML 文件中…

STM32與i.MX6ULL內存與存儲機制全解析:從微控制器到應用處理器的設計差異

最近做FreeRTos&#xff0c;以及前面設計的RVOS&#xff0c;這種RTOS級別的系統內存上的分布與CortexA系列里面的分布有相當大的區別&#xff0c;給我搞糊涂了。 目錄 STM32&#xff08;Cortex-M系列&#xff09;的內存與存儲機制 Flash存儲內容RAM存儲內容啟動與運行時流程示例…

Eteam 0.3版本開發規劃

Eteam 0.1系列經歷了3個小版本&#xff0c;主要完成了團隊資料庫功能。 Eteam 0.2系列經歷了22個小版本&#xff0c;主要完成了白板和AI交互的能力。 目前的問題 目前白板上的數據有兩個來源&#xff0c;團隊資料庫和外部數據。外部數據和團隊資料庫數據邊界不是很清晰。 0.3版…

HTML5好看的水果蔬菜在線商城網站源碼系列模板5

文章目錄 1.設計來源1.1 主界面1.2 關于我們1.3 商品服務1.4 果蔬展示1.5 聯系我們1.6 商品具體信息1.7 登錄注冊 2.效果和源碼2.1 動態效果2.2 源代碼 源碼下載萬套模板&#xff0c;程序開發&#xff0c;在線開發&#xff0c;在線溝通 作者&#xff1a;xcLeigh 文章地址&#…

深入理解Java包裝類:自動裝箱拆箱與緩存池機制

深入理解Java包裝類&#xff1a;自動裝箱拆箱與緩存池機制 對象包裝器 Java中的數據類型可以分為兩類&#xff1a;基本類型和引用類型。作為一門面向對象編程語言&#xff0c; 一切皆對象是Java語言的設計理念之一。但基本類型不是對象&#xff0c;無法直接參與面向對象操作&…

uniapp自定義拖拽排列

uniapp自定義拖拽排列并改變下標 <!-- 頁面模板 --> <template><view class"container"><view v-for"(item, index) in list" :key"item.id" class"drag-item" :style"{transform: translate(${activeInde…

基于SpringBoot的課程管理系統

前言 今天給大家分享一個基于SpringBoot的課程管理系統。 1 系統介紹 課程管理系統是一種專門為學校設計的軟件系統&#xff0c;旨在幫助學校高效地管理和組織各類課程信息。 該系統通常包括學生、教師和管理員三大角色。 他們可以通過系統進行選課、查看課程表、考試、進…