lambda表达式浅析【C++学习笔记】

基本用法:

auto f = [/*捕获列表*/](/*参数*/)->int /*后置返回值类型*/
	{
		/*
		 * 函数体
		 */
	};

捕获列表:

  • [] : 不捕获任何变量
  • [变量名] : 表示值捕获,不可修改
  • [=] :按值捕获所有变量,不可修改
  • [&] : 按引用捕获可以修改
  • [this] : 在类中捕获,捕获当前类的this指针,如果使用 = & 捕获,则默认捕获this指针
  • [& 变量名] :按引用捕获该变量
  • [ = , & 变量名] ; 按值捕获所有变量,但是按引用捕获变量名变量,按引用捕获的变量,每个前面都有写一个&
  • [ &,变量名] : 按引用捕获所有变量,但是按值捕获变量名变量

lambda表达式延迟调用易错点

int a = 12;
	auto f = [=]() ->int 
	{
		return a;
	};
	a = 99;
	cout << f() << endl;

输出:

lambda表达式浅析【C++学习笔记】_变量名

为什么输出不是99呢?

因为在遇到auto f = [=]() ->int这一行时,a的值就已经被复制到lambda表达式中了

要避免这个错误可以使用按引用捕获

lambda表达式类型

lambda表达式是闭包类型,可以理解成函数中的函数

编译器会为每个lambda表达式生成一个类,和一个可调用类对象

lambda表达式用法介绍

vector<int> vec{ 12,23,435,56,76 };
	int isnums = 9;
	for_each(vec.begin(), vec.end(), [=](int& val)
		{
			val -= isnums;
		});
	for (auto value : vec)
	{
		cout << value << endl;
	}

广义lambda捕获

解决lambda捕获依赖于类对象问题

将m_object复制到闭包里面来

[ temp = m_object]()
{
    return temp;

};