C++11 中一個很有趣的東西,Lambda表達式,稱可調用對象,也叫函數對象。

最近在工作中接觸到一些C++11的東西,感覺挺有趣的。都沒有寫博客的習慣,打算以後學點東西記一記。ok,先來講講有趣的函數對象Lamdba。
lambda表達式格式如下:
[捕獲列表] (參數列表) -> 返回值 類型 {函數體}
下面是一個求兩個數和的lambda

auto sum = [](int a,int b) -> int { return a + b; };
std::cout << sum(1,2) << std::endl;

這種寫法跟獨立寫一個函數沒什麼區別,只是方便了一點,其實lambda跟一般的函數最大的區別是它有一個捕獲列表,就是[]裏面的東西。
捕獲列表分爲,值捕獲、引用捕獲、隱式捕獲。

1、值捕獲

void fcn1()
{
    size_t v1 = 42; //局部變量
    // 將v1拷貝到名爲f的可調用對象
    auto f = [v1] {return v1; };
    v1 = 0;
    auto j = f(); //j 爲42,f保存了我們創建它是v1的拷貝
}

2、 引用捕獲

void fcn2()
{
    size_t v1 = 42; //局部變量
    // 對象f2包含v1的引用
    auto f2 = [&v1] {return v1; };
    v1 = 0;
    auto j = f2(); //j 爲0,f保存了v1的引用,而非拷貝
}

3、 隱式捕獲,它表示讓編譯器自己去推斷出捕獲列表。
[&] 表示所有在lambda體中的所有使用到的來自所在函數體的的實體都採用引用獲取。
[=] 與上面類似,只是所用到的實體用拷貝自lambda所在的函數。
在用隱式捕獲的時候,可以制定部分變量用特定的放鬆捕獲。
[&, c] 表示用到的所有變量用引用方式捕獲,除了變量c用拷貝的放鬆捕獲。
[=,&c]表示用到的所有變量用拷貝放鬆捕獲,除了變量c用引用方式捕獲。

參考C++primer 第5版

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章