首页  

C++11 lambda     所属分类 c 浏览量 851
lambda表达式 C++11新特性

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

carpture 捕获列表  lambda表达式可访问的 上下文变量
params   参数  lambda的参数,用在{}中
opt      选项  例如mutable
ret      返回值类型   会自动推断返回值
body     函数具体实现

捕获列表   
[]      不捕获任何变量
[=]     按值捕获变量
[&]     按引用捕获变量
[this]  值传递捕获当前的this
捕获列表不允许重复传递变量 
[=,x]
=表示按值捕获所有的变量,x 重复捕获

只有当lambda的表达式仅有一条return语句时,自动推断才有效 

按值捕获实际上是拷贝了一个与被捕获变量同名的const 副本并进行操作
mutable 取消常量
mutable 修饰的 lambda 表达式 没有参数也要写()
auto f4 = [=]()mutable{a++;return a+b;};
不用mutable 编译报错
cannot assign to a variable captured by copy in a non-mutable lambda

引用捕获 没有这种限制
见 f3 和  f3_1


#include "iostream" using namespace std; // g++ -std=c++11 int main(){ int a = 1,b = 2; auto f = [=]{return a+b;}; int c = f(); cout << c << endl; //按值捕获a auto f1 = [=]{return a+1;}; auto f1_1 = [=](){return a+1;}; //按引用捕获a auto f2 = [&]{return a+2;}; auto f2_1 = [&](){return a+2;}; cout << f1() << endl; cout << f1_1() << endl; cout << f2() << endl; cout << f2_1() << endl; // 按引用捕获a 并修改 auto f3 = [&]{a++;return a+b;}; auto f3_1 = [&]()mutable{a++;return a+b;}; cout << f3() << endl; cout << "a=" << a << endl; cout << f3_1() << endl; cout << "a=" << a << endl; // 按值捕获a 并修改 // cannot assign to a variable captured by copy in a non-mutable lambda // auto f4 = [=]{a++;return a+b;}; auto f4 = [=]()mutable{a++;return a+b;}; cout << f4() << endl; cout << "a=" << a << endl; return 0; }

上一篇     下一篇
Aerospike Evict机制

C++经典语录

编程名言名句

编程的十个至理名言

c++异常处理

c++菱形继承