C++11 的 lambda 表达式规范如下:
[capture](parameters) mutable exception attribute ->retury-type {statement}
其中,
mutable 修饰符说明 lambda 表达式体内的代码可以修改被捕获的变量,并且可以访问被捕获对象的 non-const 方法。
exception 说明 lambda 表达式是否抛出异常(noexception),以及抛出何种异常,类似于void f() throw(X, Y)。
attribute 用来声明属性。
capture 捕捉列表, 能够访问一些上下文中的数据以供Lambda函数使用, 可以有以下集中形式:
[] // 不捕获任何外部变量
[a] // 以值的形式捕捉外部变量a
[=] // 以值的形式捕获所有外部变量
[&] // 以引用形式捕获所有外部变量
[x, &y] // x 以传值形式捕获,y 以引用形式捕获
[=, &z] // z 以引用形式捕获,其余变量以传值形式捕获
[&, x] // x 以值的形式捕获,其余变量以引用形式捕获
[this] 捕获当前类中的this指针,如果已经使用了&或者=就默认添加此选项
#include <iostream>
int main() {
int n = 100;
auto f = [n](int k) { return n + k ; };
std::cout << f(3) << endl;
auto b = 3;
auto b2 = [n, &b] (int c) -> int{ // n只读, b读写
b = c*2;
return n + c;
}(1000);
std::cout << n << std::endl;
std::cout << b << std::endl;
std::cout << b2 << std::endl;
//int sum = 10;
//cout << [&](int n) { return sum += n * n;}(10);
//cout << "\n";
//cout << sum;
//
//cout << "\n";
//int t = 1;
//cout << [=](int n) mutable { return t += n * n;}(10);
//cout << "\n";
//cout << t;
//
//cout << "\n";
//int a = 3, b = 4;
//cout << [=, &b](int n) { return b += n * n + a;}(10);
//cout << "\n";
//cout << b;
}