一、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中,对象通过值传递,但可以在函数内部修改捕获变量的值。
有趣的是这个改变不会反映到外部变量
这非常类似不同函数总的静态变量