std::lambda小记

目录

不同形式的语法说明

[ capture ]

例子


lambda是C++11中才引入的新特性,能定义匿名对象,而不必定义独立的函数和函数对象。

在介绍函数对象的for_each例子中,如果不用创建函数对象,可以使用下面

std::for_each(dest.begin(), dest.end(), [](int i){ std::cout << ' ' << i; });

上述代码中红色部分就是ambda表达式,编译器会对这部分代码生成一个匿名的函数对象类。

如果只是在某一处使用,使用lambda表示更加简洁,不用特意写一个函数或者函数对象类;使用lambda表达式表达能力更强,提高代码清晰度。

lambda的4种不同形式

[ capture ] ( params ) mutable exception attribute -> ret { body }  —— 这是一个完整的声明。

[ capture ] ( params ) -> ret { body }  ——去掉了mutable关键字,不能修改捕获外部对象的值(外部变量在capture中定义,见后面介绍)

[ capture ] ( params ) { body } ——去掉了返回值类型ret的定义,要么根据函数体body中的return自动推倒,要么返回类型是void(上述例子用的就是这个形式)。

[ capture ] { body } ——去掉了输入参数列表params的定义,即函数参数列表空,是()

[ capture ]说明

该部分指定了哪些外部变量可以在lambda函数体body中可见,符号可按如下规则传入:

  1. []      不捕获任何外部变量 
  2. [=]     以值的形式捕获lambda表达式所在函数的函数体中的所有外部变量 
  3. [&]     以引用的形式捕获lambda表达式所在函数的函数体中的所有外部变量
  4. [a,&b]  按值捕获a,并按引用捕获b 
  5. [=, &a] 以引用的形式捕获a,其余变量以值的形式捕获 
  6. [&, a] 以值的形式捕获a,其余变量以引用的形式捕获 
  7. [this]  按值捕获了this指针  

例子

1.lambda表达式产生一个匿名对象,然后调用。

 []{ std::cout << "I am listening Summer's song" << std::endl; }();

 

2.lambda表达式产生一个匿名对象,然后调用,然后返回值存在变量 lambda_return 中。

std::string lambda_return = [](const std::string &str)->std::string{ return "I am listening " + str; }("Summer's song"); 

std::cout << lambda_return << std::endl;

3.lambda表达式产生一个匿名函数,保存在func对象中,然后通过func调用。返回值没有显示声明,是通过return自动推导的。

auto func = [](const std::string &str){ return "I am listening " + str; };

std::cout << func("Summer's song") << std::endl;

4.按传值的方式捕获外部变量,需要加上mutable关键字 否则不能在lambda表达式中修改total的值,由于是传值方式  所以在lambda表达式外部total的值并没有改变 但是在lambda表达式内部改变了

int total = 0;

 [total](int num)mutable{ total += num; std::cout << total << std::endl; }(2);

std::cout << "capture by value:" << total << std::endl;

5.按传引用的方式捕获外部变量,不需要加上mutable关键字,由于是传引用方式 所以在lambda表达式内部和外部都在total的值改变了

int total = 0;

[&total](int num){ total += num; std::cout << total << std::endl; }(2);

std::cout << "capture by reference:" << total << std::endl;

ps:lambda表达式产生的临时对象叫做闭包对象

猜你喜欢

转载自blog.csdn.net/u012138730/article/details/88657532
std