C++11 lambda
所属分类 c
浏览量 841
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++菱形继承