C++ —— Lambda 表達式

在這里插入圖片描述
在這里插入圖片描述

🎁個人主頁:工藤新一1

🔍系列專欄:C++面向對象(類和對象篇)

🌟心中的天空之城,終會照亮我前方的路

🎉歡迎大家點贊👍評論📝收藏?文章


文章目錄

  • Lambda
    • 一、Lambda表達式語法
    • 二、Lambda 表達式的應用
    • 三、捕捉列表
      • 3.1概念與功能描述
      • 3.2mutable
    • 四、Lambda 的原理
    • 五、Lambda 捕獲懸垂引用問題

Lambda

一、Lambda表達式語法

? lambda 表達式本質是一個匿名函數對象,跟普通函數不同的是他可以定義在函數內部。lambda 表達式語法使用層而言沒有類型,所以我們?般是? auto 或者模板參數定義的對象去接收 lambda 對象

  • lambda 表達式特點:輕量級
  • 快速定義一個匿名函數對象(也被稱作:CLosure 閉包

lambda 表達式的格式:[capatrue-list](parameters)-> return type { function body }

  • [capatrue-list]: 捕捉列表,該列表總是出現在 [lambda] 函數的開始位置,編譯器根據 [] 來判斷接下來的代碼是否為 lambda 函數,捕捉列表能夠捕捉上下文中的變量 供 lambda 函數使用,捕捉列表可以傳值和傳引用捕捉(注意:即使捕捉列表為空也不能被省略)

  • (parameters): 參數列表,與普通函數的參數列表功能類似,如果不需要參數傳遞,那么即可連同 () 一起省略

  • -> return type: 返回值類型,用追蹤返回類型形式聲明函數的返回值類型,沒有返回值時此部分可省略。一般返回值類型明確的情況下,也可省略,由編譯器對返回類型進行推導

  • { function body }: 函數體,函數體內的實現跟普通函數完全類似,在該函數體內,除了使用其參數外,還可使用所有捕獲到的變量,函數體為空時也不能被省略。

在這里插入圖片描述


在這里插入圖片描述


在這里插入圖片描述


二、Lambda 表達式的應用

? 在學習 lambda 表達式之前,我們的使?的可調?對象只有 函數指針仿函數對象,函數指針的類型定義起來?較?煩,仿函數要定義?個類,相對會?較?煩。使用 lambda 去定義可調?對象,既簡單又方便

? lambda 在很多其他地??起來也很好?,?如 線程 中定義線程的執?函數邏輯,智能指針 中定制 刪除器 等,lambda 的應?還是很?泛的,以后我們會不斷接觸到

在這里插入圖片描述


在這里插入圖片描述


在這里插入圖片描述


在這里插入圖片描述


在這里插入圖片描述


在這里插入圖片描述


三、捕捉列表

3.1概念與功能描述

? lambda 表達式中默認只能用 lambda 函數體和參數中的變量,如果想運?外層作?域中的變量則需要進行 “捕捉”

  • 第一種捕捉方式:在捕獲列表中顯示 傳值捕獲(變量只讀狀態)傳引用捕獲,捕獲多個變量用逗號進行分割。[ x, y, &z ] 表示 xy 值捕獲,z 引用捕獲
  • 第?種捕捉方式:在捕捉列表中隱式捕捉,在捕捉列表寫?個 = 表?隱式值捕捉(將變量全部變為值捕捉),在捕捉列表 寫?個 & 表?隱式引用捕捉,這樣我們 lambda 表達式中使用的那些變量,編譯器就會對其進行?動捕捉

注意:隱式捕獲,不是將程序中的所有變量都捕捉到 **lambda** 表達式中,而是需要哪個,捕獲哪個

  • 第三種捕捉方式:在捕捉列表中混合使?隱式捕捉和顯?捕捉, [ = , &x ] 表?其他變量隱式值捕捉, x 引?捕捉;[ &, x, y ] 表?其他變量引?捕捉,xy 值捕捉。當使?混合捕捉時,第?個元素必須是 & 或 =,并且 & 混合捕捉時,后?的捕捉變量必須是值捕捉,同理 = 混合捕捉時,后?的捕捉變量必須是引?捕捉。

在這里插入圖片描述


在這里插入圖片描述


在這里插入圖片描述


  • lambda 表達式在函數局部域中,他可以捕捉 lambda 位置之前定義的變量,不能捕捉靜態局部變量和全局變量,靜態局部變量和全局變量也不需要捕捉,lambda 表達式中可以直接使用。這也意味著**lambda** 表達式如果定義在全局位置,捕獲列表必須為空

在這里插入圖片描述


3.2mutable

  • 默認情況下, lambda 捕捉列表是被 const 修飾的,也就是說傳值捕捉而來的對象不能被修改,mutable 加在參數列表的后?可以 取消其常量性,也就說使?該修飾符后,傳值捕捉的對象就可以被修改了,但是修改還是形參對象,不會影響實參(類似值傳遞,返回的是自身數據的一份臨時拷貝)— — 被 lambda 通過 “傳值捕獲” 的內部變量,本質是外部變量的一份臨時拷貝。使用 mutable 修飾符后,參數列表不可省略(即使參數不能為空)。

在這里插入圖片描述


四、Lambda 的原理

? lambda 的原理和 范圍for 很像,編譯后從匯編指令層的?度看,壓根就沒有 lambda范圍for 這樣的東西。范圍for 底層是迭代器,?lambda 底層是仿函數對象,也就說我們寫了?個 lambda 以后,編譯器會?成?個對應的仿函數的類

? 仿函數的類名是編譯按?定規則?成的,保證不同的 lambda ?成的類名不同,lambda 參數/返 回類型/函數體就是仿函數 operator() 的參數/返回類型/函數體, lambda 的捕獲列表本質是?成 的仿函數類的成員變量,也就是說捕獲列表的變量都是 lambda 類構造函數的實參,當然隱式捕獲,編譯器要看使?哪些就傳那些對象

  • 上?的原理,我們可以透過 匯編層 了解?下
class Rate
{
public:Rate(double rate): rate(rate) {}double operator()(double money, int year){return money * rate * year;}private:double rate;
};int main()
{double rate = 0.49;//仿函數對象Rate r1(rate);r1(1000, 2);auto func1 = [](){cout << "Hello World" << endl;}; func1();//lambda//捕獲列表中的rate,可以視作 lambda 類構造函數的參數傳遞auto r2 = [rate](double money, int year){return money * rate * year;};r2(1000, 2);return 0;
}

在這里插入圖片描述


  • 本質上都是給構造函數傳參

在這里插入圖片描述


在這里插入圖片描述


  • 定義 lambda - 生成仿函數

  • 定義 lambda 對象 - 初始化仿函數對象

在這里插入圖片描述


五、Lambda 捕獲懸垂引用問題

在這里插入圖片描述

此外,多線程中如果 捕獲引用,也可能出現 引用失效 的問題,這會導致程序結果錯誤或訪問異常等;而對于 傳值捕獲 則不會出現這種問題


在這里插入圖片描述


在這里插入圖片描述


在這里插入圖片描述

🌟 各位看官好我是工藤新一1呀~

🌈 愿各位心中所想,終有所致!

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

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

相關文章

十三、面向對象底層邏輯-Dubbo序列化Serialization接口

一、引言&#xff1a;分布式通信的數據橋梁 在分布式服務調用中&#xff0c;參數的跨網絡傳輸需要將對象轉化為二進制流&#xff0c;這一過程直接影響系統的性能、兼容性與安全性。Dubbo通過Serialization接口構建了可擴展的序列化體系&#xff0c;支持多種序列化協議的無縫切…

批量剪輯 + 矩陣分發 + 數字人分身源碼搭建全技術解析,支持OEM

在互聯網內容生態蓬勃發展的當下&#xff0c;企業與創作者對內容生產與傳播效率的要求日益增長。批量剪輯、矩陣分發和數字人分身技術的融合&#xff0c;成為提升內容創作與運營效能的關鍵方案。從源碼層面實現三者的搭建與整合&#xff0c;需要深入理解各功能技術原理&#xf…

Java List 接口知識點詳解

一、List 接口概述 1. 基本定義 繼承關系&#xff1a;List 是 Java 集合框架&#xff08;Collection Framework&#xff09;中的一個有序隊列接口&#xff0c;直接繼承自 Collection 接口。核心特性&#xff1a; 有序性&#xff1a;元素按插入順序存儲&#xff0c;可通過索引…

OpenCV-去噪效果和評估指標方法

實驗前言 噪音類型 opencv常見噪音類型有 高斯噪音&#xff1a;高斯噪音是一種隨機噪音&#xff0c;其數值服從正態分布。圖像受到高斯噪音的影響時&#xff0c;像素值的變化類似于白噪音&#xff0c;但是噪音的強度會隨像素值的變化而變化。 椒鹽噪音&#xff1a;椒鹽噪音是…

永磁同步電機公式總結【一】——反電動勢、磁鏈、轉矩公式;三項、兩項電壓方程;坐標表換方程

一、PMSM 電機參數介紹 1.1 轉子極數 轉子極數 (Rotor Poles) &#xff1a;三相交流電機每組線圈都會產生 N、S 磁極&#xff0c;每個電機每相含有的永磁體磁極個數就是極數。由于磁極是成對出現的&#xff0c;所以電機有 2、4、6、8……極 (偶數)。 未知參數的電機&#xff…

eMMC深度解析:嵌入式多媒體卡的硬件電路設計要點

一、eMMC 技術深度解析 1.定義與背景 eMMC&#xff08;Embedded Multi Media Card&#xff09;是一種專為嵌入式系統設計的非易失性存儲解決方案&#xff0c;它將 NAND 閃存、主控芯片和接口協議封裝在一個 BGA&#xff08;Ball Grid Array&#xff09;封裝中。其核心目標是簡…

常見提示詞攻擊方法和防御手段——提示詞越獄

提示詞越獄&#xff08;Prompt Jailbreaking&#xff09;是一種針對大型語言模型&#xff08;LLM&#xff09;的攻擊手段&#xff0c;旨在通過精心設計的輸入提示繞過模型的安全審查和倫理限制&#xff0c;使其生成原本被禁止的內容&#xff08;如暴力、非法操作、敏感信息等&a…

MySQL之基礎事務和隔離級別

目錄 引言&#xff1a; 什么是事務&#xff1f; 事務和鎖 mysql數據庫控制臺事務的幾個重要操作指令&#xff08;transaction.sql&#xff09; 1、事物操作示意圖&#xff1a; 2.事務的隔離級別 四種隔離級別&#xff1a; 總結一下隔離指令 1. 查看當前隔離級別?? …

學習記錄:DAY29

項目開發日志&#xff1a;技術實踐與成長之路 前言 回顧這幾天的狀態&#xff0c;熱情總是比我想象中更快被消耗完。比起茫然徘徊的小丑&#xff0c;我更希望自己是對著風車沖鋒的瘋子。 今天繼續深入項目的實際業務。 狀態好點的時候&#xff0c;再看自己EMO時寫的東西&…

kotlin Android AccessibilityService 無障礙入門

安卓的無障礙模式可以很好的進行自動化操作以幫助視障人士自動化完成一些任務。 無障礙可以做到&#xff0c;監聽屏幕變化&#xff0c;朗讀文本&#xff0c;定位以及操作控件等。 以下從配置到代碼依次進行無障礙設置與教程。 一、配置 AndroidManifest.xml 無障礙是個服務…

【Vue篇】數據秘語:從watch源碼看響應式宇宙的蝴蝶效應

目錄 引言 一、watch偵聽器&#xff08;監視器&#xff09; 1.作用&#xff1a; 2.語法&#xff1a; 3.偵聽器代碼準備 4. 配置項 5.總結 二、翻譯案例-代碼實現 1.需求 2.代碼實現 三、綜合案例——購物車案例 1. 需求 2. 代碼 引言 &#x1f4ac; 歡迎討論&#…

WPS中代碼段的識別方法及JS宏實現

在WPS中&#xff0c;文檔的基本結構可以通過對象模型來理解&#xff1a; &#xff08;1&#xff09;Document對象&#xff1a;表示整個文檔 &#xff08;2&#xff09;Range對象&#xff1a;表示文檔中的一段連續區域&#xff0c;可以是一個字符、一個句子或整個文檔 &#…

el-tree結合el-tree-transfer實現穿梭框里展示樹形數據

參考文章&#xff1a;我把他的彈框單拉出來一個獨立文件作為組件方便使用&#xff0c;遇到一些問題記錄一下。 testComponet.vue <template><div class"per_container"><div class"per_con_left"><div class"per_con_title&q…

Go 后端中雙 token 的實現模板

下面是一個典型的 Go 后端雙 Token 認證機制 實現模板&#xff0c;使用 Gin 框架 JWT Redis&#xff0c;結構清晰、可拓展&#xff0c;適合實戰開發。 項目結構建議 /utils├── jwt.go // Access & Refresh token 的生成和解析├── claims.go // 從請求…

Typescript學習教程,從入門到精通,TypeScript 對象語法知識點及案例代碼(7)

TypeScript 對象語法知識點及案例代碼 TypeScript 是 JavaScript 的超集&#xff0c;提供了靜態類型檢查和其他增強功能。在 TypeScript 中&#xff0c;對象是面向對象編程&#xff08;OOP&#xff09;的基礎。 一、對象概述 在 TypeScript 中&#xff0c;對象是屬性的集合&a…

應用BERT-GCN跨模態情緒分析:貿易緩和與金價波動的AI歸因

本文運用AI量化分析框架&#xff0c;結合市場情緒因子、宏觀經濟指標及技術面信號&#xff0c;對黃金與美元指數的聯動關系進行解析&#xff0c;揭示本輪貴金屬回調的深層驅動因素。 周三&#xff0c;現貨黃金價格單日跌幅達2.1%&#xff0c;盤中觸及3167.94美元/盎司關鍵價位&…

命令行登錄 MySQL 報 Segmentation fault 故障解決

問題描述&#xff1a;對 mysql8.0.35 源碼進行 make&#xff0c;由于一開始因為yum源問題少安裝依賴庫 庫&#xff0c;在鏈接時遇到錯誤 undefined reference to&#xff0c;后來安裝了相關依賴庫&#xff0c;再次 make 成功。于是將 mysqld 啟動&#xff0c;再用 mysql -u roo…

Axure設計數字鄉村可視化大屏:構建鄉村數據全景圖

今天&#xff0c;讓我們一同深入了解由Axure設計的數字鄉村可視化大屏&#xff0c;看看它如何通過精心的布局和多樣化的圖表類型&#xff0c;將鄉村的各類數據以直觀、易懂的方式呈現出來&#xff0c;為鄉村管理者提供有力的數據支持。 原型效果預覽鏈接&#xff1a;Axure數字鄉…

3D個人簡歷網站 4.小島

1.模型素材 在Sketchfab上下載狐貍島模型&#xff0c;然后轉換為素材資源asset&#xff0c;嫌麻煩直接在網盤鏈接下載素材&#xff0c; Fox’s islandshttps://sketchfab.com/3d-models/foxs-islands-163b68e09fcc47618450150be7785907https://gltf.pmnd.rs/ 素材夸克網盤&a…

智能開發工具PhpStorm v2025.1——增強AI輔助編碼功能

PhpStorm是一個輕量級且便捷的PHP IDE&#xff0c;其旨在提高用戶效率&#xff0c;可深刻理解用戶的編碼&#xff0c;提供智能代碼補全&#xff0c;快速導航以及即時錯誤檢查。可隨時幫助用戶對其編碼進行調整&#xff0c;運行單元測試或者提供可視化debug功能。 立即獲取PhpS…