//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;
}