Lambda表达式是C++11的一个新的语法糖,它可以让我们方便的定义和创建匿名函数

1.完整的声明格式

[capture list] (params list) mutable exception-> return type { function body }

capture list:捕获列表能够捕捉上下文中的变量以供Lambda函数使用。

params list: 与普通函数的参数列表一致,如果不需要参数传递,则可以连同括号“()”一起省略。

mutable*:解除函数的常量性,因为默认的lambda函数都是常函数,使用该关键字,()不能省略。

exception*:异常说明,用于Lamdba表达式内部函数抛出异常。(基本用不上)

-> return type:返回值类型,无返回值时,和箭头一起省略。

function body:函数体

2.capture list 捕获列表

  1. [] 表示不捕获任何变量
int _tmain(int argc, _TCHAR* argv[])
{
	auto func = []{
		std::cout << "lambdaFunc" << endl;
	};

	func();
	return 0;
}

  1. [val] 通过值传递捕获val变量
int _tmain(int argc, _TCHAR* argv[])
{
	int value = 1;
	auto func = [value]{
		//value++;  --没加mutable修饰,不能修改捕获的值
		std::cout << value << endl;
	};

	func();
	return 0;
}

  1. [=] 通过值传递捕获所有可见区域的值
int _tmain(int argc, _TCHAR* argv[])
{
	{
		int value2 = 1;
	}

	{
		int value = 1;
		auto func = [=]()mutable{
			value++;  //--没加mutable修饰,不能修改捕获的值
			std::cout << value << endl;
			//std::cout << value2 << end; //不能捕获到该值
		};
		std::cout << value << endl; //1
		func(); //2
		std::cout << value << endl;//1
	}

	return 0;
}

4.[&] 通过引用传递捕获所有可见区域的值

	{
		int value2 = 1;
	}
	{
		int value = 1;
		auto func = [&]()mutable{
			value++;  //--没加mutable修饰,不能修改捕获的值
			std::cout << value << endl;
			//std::cout << value2 << end; //不能捕获到该值
		};
		std::cout << value << endl; //1
		func(); //2
		std::cout << value << endl;//2
	}

5.[this] 捕获当前的this对象

6.[=,&]混合捕捉:例如[=,&val],除val外其他都是值传递