一、Lambda
Lambda一般格式是:
[capture](param) mutable ->return-type {body}
lambda中有个闭包的概念,也就是C这类语言中的域的概念,要访问闭包外的变量,就必须通过 [] 来捕获
[]的形式有以下:
- [] 未定义任何变量,不能访问lambda之外定义的变量
- [x, &y] x是通过值复制来访问的,y通过引用访问
- [&] 能通过引用访问外部所有变量
- [=] 外部变量都是通过值复制来访问
- [&, x] x通过值复制访问,其他变量通过引用访问
- [=, &z] z通过引用访问,其他变量通过值捕获
例1:
int x=0;
int y = 42;
auto fun = [x, &y] {
std::cout<<"x: "<<x<<std::endl;
std::cout<<"y: "<<y<<std::endl;
y++;
}
x = y = 77;
fun();
fun();
std::cout<<"final y: "<<y <<std::endl;
输出结果为
x: 0
y: 77
x: 0
y: 78
final y: 79
这个例子很好理解,因为y是用引用传递的,在lambda中的改变也会反映到外部变量中,而x只是值传递,在lambda中只读
例2:
int id = 0;
auto fun = [id]() mutable {
std::cout<<"id: "<<id<<std::endl;
id++;
}
id = 42;
fun();
fun();
fun();
std::cout<<"id"<<std::endl;
输出结果为:
id: 0
id: 1
id: 2
42
这个例子中,在lambda的声明中使用了mutable。
在使用了mutable的lambda中,对象通过值传递,但可以在函数内部修改捕获变量的值。
有趣的是这个改变不会反映到外部变量
这非常类似不同函数总的静态变量