std::for_each()
[capture list] (params list) mutable exception-> return_type {function body}
含义:
- captrue list:捕获外部变量列表
- params list:形参列表
- mutable 指示符:用来说明是否可以修改捕获的变量
- exception:异常设定
- return_type:返回类型
- function body:函数体
此外,我们还可以省略其中的某些成分来声明“不完整”的Lambda表达式,常见的有以下几种:
序号 | 格式 |
---|---|
1 | [capture list] (params list) -> return type {function body} |
2 | [capture list] (params list) {function body} |
3 |
|
捕获与参数传入的区别,以一个结构体的函数对象例子
struct amc{
int i_, j_ ;
amc(int i, int j);
bool operator()(int a, int b){
i *= j;
std::cout<<a*b<<std::endl;
}
};
如果用lambda,
[i_, j_](const int a, const int b){
i_ *= j_;
return a*b;
}
捕获一般是对成员变量, 参数传入是对于函数的输入参数
C++11捕获外部变量总结
捕获形式 | 说明 |
---|---|
[] | 不捕获任何外部变量 |
[变量名, …] | 默认以值得形式捕获指定的多个外部变量(用逗号分隔),如果引用捕获,需要显示声明(使用&说明符) |
[this] | 以值的形式捕获this指针 类中所有成员变量 |
[=] | 以值的形式捕获所有外部变量 |
[&] | 以引用形式捕获所有外部变量 |
[=, &x] | 变量x以引用形式捕获,其余变量以传值形式捕获 |
[&, x] | 变量x以值的形式捕获,其余变量以引用形式捕获 |
对于值捕获[=]和引用捕获[&],
如果以传值方式捕获外部变量,则在Lambda表达式函数体中不能修改该外部变量的值。因为
值捕获创建了一个临时对象,拷贝了原变量的值,之后,这个临时变量与原来的变量再无任何瓜葛,lambda中操作的是这个临时变量。否则报错:
error: increment of read-only variable ‘b’
13 | b++;
如果非要修改值捕获的变量,有方法吗?有!加上关键字mutable。
但是!修改对原变量无任何影响!
b=1;
auto ef = [b]()mutable{
b++;
std::cout<<"bb: "<<b<<std::endl;
};
但因为还是值传递,所以ef()会打印bb: 2 而实际外部的b还是1