C++11 lambda使用技巧小结

来源:互联网 发布:潘多网络黄彬 编辑:程序博客网 时间:2024/04/29 17:35

在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 0
原创粉丝点击