C++11 lambda使用技巧小结

在lambda中 一般的参数捕获有

1.[=]值传递

2.[&]引用传递

官方文档写传值只能读不能写,但传引用的话可以读和写。

如果增加mutable声明, 则可以修改值传递的对象。


例1

j = 10;
	auto by_val_1 = [j]()mutable{ j++; cout << "lambda j: " << j << endl; };
	by_val_1();
	cout << "j: " << j << endl;

结果

lambda j: 11
j: 10

这个例子 lambda中通过尝试修改变量j,并且输出修改后的值显示为11
但是 对于外部的变量j并没有任何改动

因而得知  值传递带mutable声明虽然可以改变lambda中的对象, 但不会对外部变量产生影响


例2

class Obj
{
public:

	void TestFunc() { cout << "TestFunc" << endl; }

};
Obj obj1;
auto by_ref_func = [&]() 
	{ 
		cout << "by ref lam" << obj1.m_n1 << endl;
		obj1.TestFunc();
	};
	by_ref_func();

auto by_va_func = [=]()
	{
		cout << "by val lam" << obj1.m_n1 << endl;
		obj1.TestFunc();
	};


以上的代码无法通过编译


在lambda内调用对象的普通函数 可以使用引用传递 

但普通的值传递不能  有两种办法解决

1 增加mutable声明

auto by_val_lambda_func = [=]()mutable
	{
		cout << "by val lam" << obj1.m_n1 << endl;
		obj1.TestFunc();
	};



2 目标调用函数声明为const
class Obj
{
public:

	void TestFunc() const { cout << "TestFunc" << endl; }

};




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值