聊聊 C++ 和 C# 中的 lambda 玩法

這幾天在看 C++ 的 lambda 表達式,挺有意思,這個標準是在 C11標準 加進去的,也就是 2011 年,相比 C# 2007 還晚了個 4 年, Lambda 這東西非常好用,會上癮,今天我們簡單聊一聊。

一:語法定義

首先我們看下 C++ 語法定義格式:

[capture] (parameters) mutable ->return-type{statement}

相比 C# lambda 的語法格式:

(parameters) => {return-type statement}

要復雜一些,之所以復雜還是因為 C++ 讓程序員用的必須更謹慎一些。

二:謹慎在哪里?

為了說明更謹慎在哪里,我們上一個簡單的例子。

int?main()?{int?a?=?1;int?b?=?2;auto?func?=?[](int?c)?->?void?{cout?<<?"input:"?<<?c?<<?endl;};func(10);return?0;
}
c59d0b2a898c446e09dc66c7f22ff6a0.png

上面就定義了一個原子化的 lambda 函數,在現實開發中往往不僅要獲取參數,還要獲取 外部作用域 的變量,比如說,我想計算 a+b+c 的結果,接下來稍微改一下代碼:

1b20a763efa0a903ecda0c4635a0d805.png

可以看到,居然給報錯了,在 C# 中可是一點問題都沒有。

c889ae2884dd6de99992b094366bb430.png

1. 謹慎1 :屏蔽外部所有作用域變量

C++ 默認屏蔽所有的外部作用域值,這么做大概率還是想讓程序員知道自己的意圖,這相比 C# 要嚴謹的多,算是喜憂參半吧。

那如何讓 C++ 代碼通過呢?這就需要用到語法格式中的 [capture] 部分,簡而言之就是需要告訴編譯器打開柵欄放哪些變量進來😄😄😄,比如 =,&,兩者都可以訪問所有的外部作用域變量,不同的是前者是 按傳值方式,后者 按引用方式

  1. 按值方式

有了思路后,修改代碼如下:

int?main()?{int?a?=?1;int?b?=?2;auto?func?=?[=](int?c)?->?void?{auto?sum?=?a?+?b?+?c;cout?<<?"sum:"?<<?sum?<<?endl;};func(10);return?0;
}
6fb30130839ba2bce812171842aeeb8c.png

哈哈,這個問題我們完美搞定。

  1. 按引用方式

大家都知道,按引用 傳的是地址,言外之意就是可以做到 原地修改,接下來我們修改下代碼。

int?main()?{int?a?=?1;auto?func1?=?[&]()?->?void?{a?=?10;};func1();cout?<<?"a?="?<<?a?<<?endl;return?0;
}
492c19885fe673e38b63b3c1e3cda7ce.png

謹慎2:屏蔽所有按值傳遞的修改

為了方便說明,我們先看圖:

6637d8b67a1adb4e62ed8cfe19735462.png

可以看到,按值傳遞進來的值都是無法修改的,這么做主要還是怕程序員弄混了,如果一定要讓代碼通過,就需要增加語法格式中的 mutable 項,本質上就是踢掉默認的 const ,這樣在方法體中就可以修改 a 變量,修改代碼如下:

int?main()?{int?a?=?1;auto?func1?=?[=]()?mutable?->?void?{a?=?10;};func1();cout?<<?"a?="?<<?a?<<?endl;return?0;
}
ff20ed4dafbde4179b7fd2585e650008.png

哈哈,成功修改,當然語句夠簡單的話,還可以將下面的代碼:

auto?func1?=?[&]()?->?void?{a?=?10;};

修改成如下:

auto?func1?=?[&]()?{a?=?10;};

關于作用域方面還有很多好玩的,比如只放某一個變量進來。

70ab1538c06ae67a594b9697db0cf176.png

總體上來說,C++ 的 lambda 的格式相比 C# 更嚴謹,反過來說就是不太相信 C++ 程序員有能力用好。😂😂😂,好了,本篇就聊這么多,希望對你有幫助。

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

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

相關文章

Android之網絡請求通過協程+okhttp的沒有做網絡異常處理導致程序奔潰問題

1 問題 app里面的網絡請求是通過協程+okhttp來實現的,但是沒有做網絡異常處理(域名無法解析、502錯誤等等一系列),導致程序奔潰 2 嘗試 因為app基本上做好了,外面有大幾十個地方調用,然后又有不同的作用域,調用的地方太多了,一開始修改在最外出的網絡請求地方直接加上…

Windows10系統重裝后必不可少的優化步驟

1. 查看系統的激活狀態 Win+R,打開運行,輸入slmgr.vbs -xpr,回車! 可以看到,該系統沒有永久激活,即將過期,過期后部分功能會不可使用,需要重新激活。 2. 徹底關掉Windows Defender 方法一: 打開“命令提示符(管理員)”,然后輸入: reg add "HKEY_LOCAL_MA…

【iVX 初級工程師培訓教程 10篇文拿證】03 事件及猜數字小游戲

目錄 【iVX 初級工程師培訓教程 10篇文拿證】01 了解 iVX 完成新年賀卡 【iVX 初級工程師培訓教程 10篇文拿證】02 數值綁定及自適應網站制作 【iVX 初級工程師培訓教程 10篇文拿證】03 事件及猜數字小游戲 【iVX 初級工程師培訓教程 10篇文拿證】04 畫布及我和 iVX 合照 【iV…

visual studio系列(vs)啟動調試網站使用ip+端口局域網訪問

vs系列工具創建web應用時會自動創建一些配置文件&#xff0c;本文章講的是如何修改配置文件&#xff0c;使vs在啟動運行調試情況下 使用ip端口形式在局域網訪問。本文章使用的是vs2015&#xff0c;.net 4.5。步驟如下&#xff1a;1.使用vs創建好你的web應用&#xff0c;打開項目…

Android studio之編譯提示Could not find :umeng-asms-v1.2.1:.

1 、問題 Could not determine the dependencies of task :app:compileDebugJavaWithJavac. > Could not resolve all task dependencies for configuration :app:debugCompileClasspath.> Could not find :umeng-asms-v1.2.1:.Required by:project :app> Could not …

1-100之間的奇數

#include "stdio.h" int main() {int i0;for(i1;i<100;i){if(i%21){printf("%d ",i);}}return 0; }轉載于:https://blog.51cto.com/zhangxinbei/1718010

計算機與操作系統基礎小結

計算機基礎概念 1946年二月美國&#xff0c;世界上第一臺電子計算機ENIAC誕生&#xff0c;似乎從這一年開始世界便逐漸變得不一樣了。隨著半個世紀的時間&#xff0c;計算機技術蓬勃發展&#xff0c;推動人類進入信息社會。 計算機操作界面&#xff1a; ①圖形用戶界面 ②命令行…

WPF效果第一百八十九篇之又玩Expander+ListBox

上一篇文章已經提前預告了今天要分享的效果,今天接著上一篇的效果接著去實現,還是先來看最終實現的效果:1、關于簡單的布局設計:總結&#xff1a;①③是Expander②④⑤⑥是ListBox2、把上一篇的②這一塊用ListBox替換:<Expander Grid.Column"1" ExpandDirection&q…

作為一個甘肅天水人,我對罐罐茶有一種特殊的情懷

作為一個出生在罐罐茶世家的80后鄉土人&#xff0c;經歷了罐罐茶的發展演變歷史&#xff0c;與罐罐茶結下了不解情緣&#xff0c;下面我就跟大家分享一下劉一哥與罐罐茶的故事吧。 久違的罐罐茶.mp4美麗邂逅 我最早接觸罐罐茶應該是90年代&#xff0c;那個年代家里條件很不好&…

【iVX 初級工程師培訓教程 10篇文拿證】02 數值綁定及自適應網站制作

目錄 【iVX 初級工程師培訓教程 10篇文拿證】01 了解 iVX 完成新年賀卡 【iVX 初級工程師培訓教程 10篇文拿證】02 數值綁定及自適應網站制作 【iVX 初級工程師培訓教程 10篇文拿證】03 事件及猜數字小游戲 【iVX 初級工程師培訓教程 10篇文拿證】04 畫布及我和 iVX 合照 【iV…

將WebApiTestClient添加到ASP.NET Web API幫助頁面

ASP.NET Web API幫助頁面是一種有用的擴展&#xff0c;可為您的Web API自動生成基于Web的文檔。它使調試變得更容易&#xff0c;因為您可以將幫助頁面中的信息復制/粘貼到Fiddler等工具中&#xff0c;以調用Web API服務并檢查響應。現在&#xff0c;如果您可以直接在幫助頁面上…

【LeetCode】3. Longest Substring Without Repeating Characters

題目&#xff1a; Given a string, find the length of the longest substring without repeating characters. Examples: Given "abcabcbb", the answer is "abc", which the length is 3. Given "bbbbb", the answer is "b", with t…

Android之判斷時間戳是不是今天

1 需求 判斷時間戳是不是今天 2、工具代碼 /*** 獲取每日0點時間* @return*/fun getTodayTime(timeStamp: Long): Long {val cal = Calendar.getInstance()cal.timeInMillis = timeStampcal.set(Calendar.HOUR_OF_DAY, 0)cal.set(Calendar.SECOND, 0)cal.set(Calendar.MINUTE,…

ArcGIS實驗教程——實驗二十五:大型商場選址經典案例

ArcGIS實驗視頻教程合集:《ArcGIS實驗教程從入門到精通》(附配套實驗數據) 一、實驗分析 合理的商場位置有利于商家營業,方便人們購物。商場選址問題需要考慮很多因素,如地理位置、居民點分布、停車場分布、交通情況等。綜合把握這些影響因素對商場的選址顯得尤為重要。 …

全球域名商解析新增保有量15強:愛名網落榜

IDC評述網&#xff08;idcps.com&#xff09;11月30日報道&#xff1a;根據DailyChanges公布的最新數據顯示&#xff0c;在2015年11月26日&#xff0c;全球域名解析新增保有量15強排行榜上&#xff0c;共有5家中國域名商。其中&#xff0c;易名中國連續奪冠&#xff0c;新增保有…

大話領域驅動設計——應用層

?概述應用層是基于領域的應?程序用例的實現&#xff0c;應?程序?例可以看作是?戶界?上的?戶交互。這一篇&#xff0c;我將詳細講解應用層組件及用法。總覽應用層包含以下組件&#xff1a;數據傳輸對象&#xff08;DTO)&#xff1a;數據傳輸對象是一個簡單的對象&#xf…

IE8采用IE7模式

< DOCTYPE html PUBLIC -WCDTD XHTML StrictEN httpwwwworgTRxhtmlDTDxhtml-strictdtd> X-UA-Compatible是針對ie8新加的一個設置&#xff0c;對于ie8之外的瀏覽器是不識別的&#xff0c;這個區別與 content"IE7"在無論頁面是否包含<!DOCTYPE>指令&#…

【iVX 初級工程師培訓教程 10篇文拿證】01 了解 iVX 完成新年賀卡

目錄 【iVX 初級工程師培訓教程 10篇文拿證】01 了解 iVX 完成新年賀卡 【iVX 初級工程師培訓教程 10篇文拿證】02 數值綁定及自適應網站制作 【iVX 初級工程師培訓教程 10篇文拿證】03 事件及猜數字小游戲 【iVX 初級工程師培訓教程 10篇文拿證】04 畫布及我和 iVX 合照 【iV…

ArcGIS實驗教程——實驗二十六:ArcScene實現二維數據的三維顯示

ArcGIS實驗視頻教程合集:《ArcGIS實驗教程從入門到精通》(附配套實驗數據)》 DEM三維顯示: 地形數據+影像數據: 以上效果均是在ArcScene中實現的。 ArcScene允許用戶制作具有透明效果的場景,在場景中能對數據進行瀏覽和交互。ArcAcene支持復雜的3D符號系統及紋理制圖,支…

用Swashbuckle(swagger-ui)顯示API幫助并進行調試

安裝Swashbuckle&#xff1a; 打開NuGet控制臺輸入&#xff1a; Install-Package Swashbuckle 進行安裝。查看幫助 在瀏覽器輸入 http://調試項目地址/swagger/ui/index 可以看到幫助的效果API調試 點開調試的條目&#xff0c;填寫相關參數&#xff0c;“Try it out!”