在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
但是 对于外部的变量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();
};
class Obj
{
public:
void TestFunc() const { cout << "TestFunc" << endl; }
};