C++ Lambda表達式詳解

一、Lambda表達式的介紹

c++11引入了Lambda表達式,使得開發(fā)人員可以更方便的創(chuàng)建匿名函數(shù)。Lambda表達式是c++語言的一個重要特性,它可以作為函數(shù)對象使用,可以用來替代一些繁瑣的函數(shù)聲明和定義。

二、Lambda表達式的語法

Lambda表達式的基本語法結(jié)構(gòu)如下:

[capture list] (parameter list) specifiers exception -> type { function body }

[capture list]是捕獲列表,在應(yīng)用中必填。
(parameter list)是參數(shù)列表,在應(yīng)用中選填。
specifiers是限定符,在應(yīng)用中選填。
exception是異常說明符,在應(yīng)用中選填。
-> type是返回值類型,在應(yīng)用中選填。
{ function body }是表達式的函數(shù)體,在應(yīng)用中必填。

下面是一個簡單的Lambda表達式:

[](int x, int y){ return x + y; }

這個Lambda表達式可以看作是一個沒有函數(shù)名的函數(shù),接受兩個整型參數(shù),并返回它們的和。應(yīng)用實例如下:

auto f = [](int x, int y){ return x + y; };
int result = f(10, 20);    //result == 30

三、Lambda表達式的捕獲列表

Lambda表達式的捕獲列表可以捕獲當(dāng)前函數(shù)作用域的零個或多個變量,變量之間用逗號分隔;這些變量可以在Lambda表達式中被訪問和修改。捕獲方式有三種,分別是值捕獲、引用捕獲和混合捕獲。

值捕獲:將外部變量以const引用的方式傳遞到Lambda表達式中,在表達式中可以訪問變量,但是不能修改變量;使用=可以將函數(shù)作用域的所有變量以值捕獲方式傳入到表達式中。

int a = 10; b = 20, c = 30;

//將變量a和b以值捕獲方式傳入到表達式中
auto f1 = [a, b]{ return a + b; };
int result1 = f1();    //result1 == 30

//將所有變量以值捕獲方式傳入到表達式中
auto f2 = [=]{ return a + b + c; };
int result2 = f2();    //result2 == 60

引用捕獲:將外部變量以引用的方式傳遞到Lambda表達式中,在表達式中可以訪問變量和修改變量;使用&可以將函數(shù)作用域的所有變量以引用捕獲方式傳入到表達式中。

int a = 10; b = 20, c = 30;

//將變量a和b以引用捕獲方式傳入到表達式中
auto f1 = [&a, &b]{ a++; b++; };
f1();    
//a == 11    b == 21

//將所有變量以引用捕獲方式傳入到表達式中
auto f2 = [&]{ a++; b++; c++; };
f2();    
//a == 12    b == 22    c == 31

混合捕獲:捕獲列表捕獲多個變量,既有值捕獲的變量也有引用捕獲的變量。

int a = 10; b = 20, c = 30;

//將變量a和b以值捕獲方式傳入到表達式中,將變量c以引用捕獲方式傳遞到表達式中
auto f = [=,&c]{ c++; return a + b; };
int result = f();    //result == 30
//c == 31

四、Lambda表達式的參數(shù)列表

Lambda表達式的參數(shù)列表與普通函數(shù)參數(shù)列表一致;如果不需要參數(shù),則可以省略此項。

//沒有參數(shù)
auto f1 = []{ return 1; };
int result1 = f1();    //result1 == 1

//兩個參數(shù)
auto f2 = [](int x, int y){ return x + y; };
int result2 = f2(10,20);    //result2 == 30

五、Lambda表達式的限定符

Lambda表達式的限定符值為mutable,其意義是可以在函數(shù)體內(nèi)修改按值捕獲的變量;如果不需要此操作,則可以省略此項。

int a = 10;

//未用mutable修飾
auto f1 = [a](){
    a++;    //報錯
}

//使用mutable修飾
auto f2 = [a]() mutable {
    a++;    //成功
}

六、Lambda表達式的異常說明符

Lambda表達式的異常說明符值為noexcept,其意義是指明表達式不會拋出異常;如果不需要此操作,則可以省略此項。

//未用noexcept修飾
auto f1 = [](int x){
    if(x == 0)
        throw(0);    //成功
    return x;
}

//使用noexcept修飾
auto f2 = [](int x) noexcept {
    if(x == 0)
        throw(0);    //報錯
    return x;
}

七、Lambda表達式的返回值類型

-> type可以指定lambda表達式返回值類型;如果不指定返回類型,則編譯器會根據(jù)代碼實現(xiàn)為函數(shù)推導(dǎo)一個返回類型;如果沒有返回值,則可忽略此部分。

//指定返回值類型
auto f1 = []()->int { return 1; };
int result1 = f1();    //result == 1

//不指定返回值類型
auto f2 = [](){ return 1; };
int result2 = f2();    //result == 1

八、Lambda表達式的函數(shù)體

Lambda表達式的函數(shù)體部分與普通函數(shù)體一致。

auto f1 = []{ std::cout << "hello world" << std::endl; };

auto f2 = [](int x, int y){ return x + y; };

九、Lambda表達式的優(yōu)缺點

Lambda表達式有以下優(yōu)點:
簡潔:Lambda表達式可以在一個表達式中定義一個函數(shù),不需要單獨聲明和定義。
方便:Lambda表達式可以捕獲外部變量,使得函數(shù)對象更加靈活和易于使用。
通用:Lambda表達式可以作為任何需要函數(shù)對象的地方使用,例如STL算法、線程等。

Lambda表達式也有一些缺點:
可讀性:Lambda表達式可能過于簡潔,難以閱讀和理解。
復(fù)雜性:Lambda表達式可以包含復(fù)雜的邏輯和控制流,使得代碼難以維護和調(diào)試。
性能:Lambda表達式可能會產(chǎn)生額外的開銷,例如變量捕獲和函數(shù)調(diào)用的開銷。

十、結(jié)論
c++Lambda表達式是一項重要的語言特性,它使得開發(fā)人員可以更方便地創(chuàng)建匿名函數(shù)和函數(shù)對象。Lambda表達式的語法簡潔、靈活,可以捕獲外部變量,并且可以作為任何需要函數(shù)對象的地方使用。Lambda表達式也存在一些缺點,包括可讀性、復(fù)雜性和性能問題。在實際開發(fā)中,開發(fā)人員應(yīng)該根據(jù)具體情況權(quán)衡利弊,選擇合適的編程風(fēng)格和實現(xiàn)方式。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. 概述 C++ 11 中的 Lambda 表達式用于定義并創(chuàng)建匿名的函數(shù)對象,以簡化編程工作。Lambda 的...
    googoler閱讀 3,924評論 0 1
  • lambda表達式 目錄 一、開篇 二、lambda初識 三、lambda基本用法 四、lambda表達式捕獲列表...
    開源519閱讀 270評論 0 0
  • Lambda表達式,也稱為匿名函數(shù)、閉包函數(shù),在別的編程語言很早就有了。 C++ 11開始,也支持了這個功能。而后...
    王玉川閱讀 431評論 0 0
  • 技術(shù)交流QQ群:1027579432,歡迎你的加入! 1.Lambda函數(shù)與表達式 C++11提供了對匿名函數(shù)的支...
    CurryCoder閱讀 5,710評論 1 3
  • C++中一共有5種調(diào)用對象:函數(shù),函數(shù)指針,重載了函數(shù)調(diào)用運算符的類(仿函數(shù)),bind創(chuàng)建的對象 和 lambd...
    wayyyy閱讀 595評論 0 0

友情鏈接更多精彩內(nèi)容