匿名函数表达式形如
[capture](parameters)->return-type{body}
capture:它定义了Lambda表达式体内部可以访问哪些外部作用域中的变量,以及这些变量是如何被捕获的。(比如值传递或者引用传递)
parameters:参数列表和普通函数的参数列表相同
return-type:返回值类型,若无返回值,可以不写
body:函数体
匿名函数可以将它们赋给变量和作为参数传递,还可以像函数一样对其求值。
//赋值给变量,分别采用值传递和引用传递
//捕获时有一点需要注意,在赋值后,x(捕获)的值发生改变,不会改变匿名函数执行
int x = 10;
auto lambdaByValue = [x]() { std::cout << "x by value: " << x << std::endl; };
auto lambdaByRef = [&x]() { x = 20; std::cout << "x by reference: " << x << std::endl; };
//直接求值,接上述,可得输出数值,20,10
lambdaByRef();
lambdaByValue();
//作为参数传递用法
std::for_each(nums.begin(), nums.end(), [](int n) {std::cout << n << ' ';});
上文提到了引用,这里对其进行说明
C++ 支持把引用作为参数传给函数,这比传一般的参数更安全。当作为值传递时,我们相当于拷贝了一份参数,但使用引用传递,相当于拿源数据进行操作。比如上述代码中的值引用会将x的值变为20。
一般来说,使用下述方式创建引用,上述方式&x有点像取地址,所以给出了捕获指针的对比代码供参考
//创建引用
int i = 17;
int& r = i;
//1指针
int x = 10;
int* y = &x;
auto lambdaByValue = [x]() { std::cout << "x by value: " << x << std::endl; };
auto lambdaByRef = [y]() { *y = 20; std::cout << "x by reference: " << *y << std::endl; };
//2引用
int x = 10;
auto lambdaByValue = [x]() { std::cout << "x by value: " << x << std::endl; };
auto lambdaByRef = [&x]() { x = 20; std::cout << "x by reference: " << x << std::endl; };
引用也可以作为返回值,和正常返回值使用方法相同。