//lambda表達式的基本語法如下:
/*
[捕獲列表] (參數列表)mutable(可選)異常屬性 -> 返回類型 {
? ? // 函數體
}*/
1,值捕獲
//1, 值捕獲示例
#include <iostream>
void lambda_value_capture() {int value = 1;auto copy_value/*返回值*/ = [value/*捕獲列表*/](/*參數列表*/)/*自動推導返回值類型*/ {return value;//函數體};value = 100;auto stored_value = copy_value(); // 調用lambda表達式std::cout << "Stored value: " << stored_value << std::endl; // 這時,stored_value仍然是1,而value==100// 因為copy_value在創建時就保存了一份value的拷貝
}//2,引用捕獲示例void lambda_reference_capture() {int value = 1;auto copy_value = [&value](/*參數列表*/) mutable {return value; // 函數體};value = 100;auto stored_value = copy_value(); // 調用lambda表達式std::cout << "Stored value: " << stored_value << std::endl; // 這時,stored_value == 100,value == 100 ;因為copy_value捕獲的是value的引用
}
//3,隱式捕獲
//手動書寫捕獲列表有時候是非常復雜的,這種機械性的工作可以交給編譯器來處理,這時候可以在
//捕獲列表中寫一個&或=向編譯器聲明采用引用捕獲或者值捕獲
//總結一下,捕獲提供了Lambda表達式對外部值進行使用的功能,捕獲列表的最常用的四種形式可以是:
//[]空捕獲列表
//[name1,name2,...]捕獲一系列變量
//[&]引用捕獲讓編譯器自行推導引用列表
//[=]值捕獲讓編譯器自行推導值捕獲列表
//4,表達式捕獲
//這部分內容需要了解后面馬上要提到的右值引用以及智能指針
//上面提到的值捕獲、引用捕獲都是已經在外層作用域聲明的變量,因此這些捕獲方式捕獲的均為左
//值,而不能捕獲右值。
//C++14給與了我們方便,允許捕獲的成員用任意的表達式進行初始化,這就允許了右值的捕獲,被
//聲明的捕獲變量類型會根據表達式進行判斷,判斷方式與使用auto本質上是相同的:
#include <utility>
#include <memory>
int main(){auto important = std::make_unique<int>(1);auto add = [v1 = 1,v2 = std::move(important)](int x, int y) mutable -> int {return x + y + v1 + *v2;};std::cout << add(3,4) << std::endl; return 0;
}