最近在工作中接觸到一些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版