《c++11学习笔记》 --- lambda表达式的用法

语法:

 [capture] (params) opt->ret { bady };

capture:捕获列表
params:参数列表
opt:函数选项
ret:返回值类型
bady:函数体

auto f = []{int a} -> int {return a + 1;};
std::cout<<f(1)<<std::endl; //输出:2
	
//c++11中可以省略返回值定义:
auto f = [](int a){return a + 1;};
	
//没有参数时,参数列表可省略,例如:
auto f1 = [](){return 0;};
auto f1 = []{return 0;}; //省略空参数列表

可以通过捕获列表捕获一定范围内的变量: 

[]不捕获任何变量。
[&]捕获外部作用域中所有变量,并作为引用在函数体中使用(按引用捕获)。
[=]捕获外部作用域中所有变量,并作为副本在函数体中使用(按值捕获)。
[=, &foo]按值捕获外部作用域中所有变量,并按引用捕获foo变量。
[bar]按值捕获bar变量,同时不捕获 其他变量。
[this]捕获当前类中的this指针,让表达式拥有和当前类成员函数同样的访问权限,如果已经使用=或者&,就默认添加此选项。

例如:

class A
{
public:
	int i = 0;
		
	void func(int x, int y)
	{
		auto x1 = []{return i;};                   //error,没有捕获外部变量
		auto x2 = [=]{return i + x + y;};          //ok,捕获所有外部变量
		auto x3 = [&]{return i + x + y;};          //ok,捕获所有外部变量
		auto x4 = [this]{return i;};               //ok,捕获this指针
		auto x5 = [this]{return i + x + y;};       //error,没有捕获x,y
		auto x6 = [this, x, y]{return i + x + y;}; //ok,捕获this指针、x、y
		auto x7 = [this]{return i++;};             //ok,捕获this指针,并修改成员值
			
    }
};

int a = 0, int b = 1;
auto f1 = []{return a;};            //error,没有捕获外部变量
auto f2 = [&]{return a++;};         //ok,捕获所有外部变量,并对a执行自加运算
auto f3 = [=]{return a;};           //ok,捕获所有外部变量,并返回a
auto f4 = [=]{return a++;};         //error,a是以复制方式捕获的,无法修改
auto f5 = [a]{return a + b;};       //error,没有捕获变量b
auto f6 = [a, &b]{return a + (b++);}; //ok,捕获a和b的引用,并对b做自加运算
auto f7 = [=, &b]{return a + (b++);}; //ok,捕获所有外部变量和b的引用,并对b做自加运算

	
//再捕获的一瞬间,a的值已经被复制到了f中,之后再修改a的值,此时f中存储的a仍然是之前捕获到的值。
int a = 0;
auto f = [=]{return a;};  //按值捕获外部变量
a += 1;                   //a被修改
std::cout<<f()<<std::endl;  //输出0
	
	
//使用mutable:
int a = 0;
auto f1 = [=]{return a++;}; //error,a是以复制方式捕获的,无法修改
auto f2 = [=]() mutable {return a++;}; //ok, 使用mutable
//注意:在使用mutable修饰的lambda表达式就算没有参数也要写明参数列表。
	
/*
*lambda表达式的operator()默认是const的,
*一个const成员函数是无法修改成员变量的值的,
*mutable的作用在于取消operator()的const
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值