C++ Lambda表達(dá)式

Lambda表達(dá)式

  • 有點(diǎn)類(lèi)似于JavaScript中的閉包,iOS中的Block, 本質(zhì)就是函數(shù)
  • 完整結(jié)構(gòu): [capture list](param list)mutable exception-> return type { function body }
    • capture list: 捕獲外部變量列表
    • param list:形參列表,不能使用默認(rèn)參數(shù),不能省略參數(shù)名
    • mutable: 用來(lái)說(shuō)明是否可以修改捕獲的變量
    • exception: 異常設(shè)定
    • return type:返回值類(lèi)型
    • function body: 函數(shù)體
  • 有時(shí)可以省略部分結(jié)構(gòu)
    • [capture list](param list)-> return type { function body }
    • [capture list](param list) { function body }
    • [capture list] { function body }

int (*p1)(int, int) = [](int v1, int v2) -> int {
    return  v1 + v2;
};

auto p2 = [](int v1, int v2) {
    return v1 + v2;
};

auto p3 = [](int v1, int v2) {
    return v1 - v2;
}(20, 30);


int exec(int a, int b, int(*func)(int, int)) {
    if (func == nullptr) {
        return 0;
    }
    return func(a, b);
}
  • Lambda表達(dá)式 外部變量捕獲

     int a = 10;
     int b = 20;
     // 值捕獲
     auto func1 = [a, b] {
         std::cout<< a << std::endl;
         std::cout<< b << std::endl;
     };
     a = 11;
     b = 30;
     func1(); // 10, 20
    
     int a = 10;
     int b = 20;
     // 隱式捕獲
     auto func2 = [=] {
         std::cout<< a << std::endl;
         std::cout<< b << std::endl;
     };
     a = 11;
     b = 30;
     func2(); // 10, 20
    
    int a = 10;
    int b = 20;
    // a是值捕獲,其余變量是地址捕獲
    auto func3 = [&, a] {
        std::cout<< a << std::endl;
        std::cout<< b << std::endl;
    };
    a = 11;
    b = 30;
    func3(); // 30, 10
    
    int a = 10;
    int b = 20;
    // a 是引用捕獲,b是值捕獲
    auto func4 = [&a, b] {
        std::cout<< a << std::endl;
        std::cout<< b << std::endl;
    };
    a = 11;
    b = 30;
    func4(); // 11, 20
    
    int a = 10;
    int b = 20;
    // 隱式捕獲(地址捕獲)
    auto func5 = [&] {
        std::cout<< a << std::endl;
        std::cout<< b << std::endl;
    };
    a = 11;
    b = 30;
    func5(); // 11, 30
    
    int a = 10;
    int b = 20;
    // a是地址捕獲,其余變量是值捕獲
    auto func6 = [=, &a] {
        std::cout<< a << std::endl;
        std::cout<< b << std::endl;
    };
    a = 11;
    b = 30;
    func6(); // 20, 11
    
  • Lambda 表達(dá)式 mutable

    int a = 10;
    auto func = [a]() mutable {
        std::cout << ++a << std::endl;
    };
    func(); // 11
    std::cout << a << std::endl; // 10
    
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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