#include<iostrean> intbar(void) { int a = 10; // 以下生成了函数对象,可以就地调用: int b = [a]() -> void { return a + 20; }()/* 熟悉的函数调用标志:圆括号 */; int c = [a](int v) -> void { return a + v + 20; }(5); return b; } intmain(void) { int r = bar(); return0; }
按值捕获
1 2 3 4 5 6 7 8 9 10 11 12 13 14
intbar() { int a = 10, b = 11; int c = [a, b](int v) -> int { return a + b + v + 20; }(5); // 也可以在中括号只填一个"=",代表按值捕获全部 int d = [=](int v) -> int { return a + b + v + 20; }(5); return c; }
intbar() { int a = 10, b = 11; int c = [=](int v) -> int { return a + b++ + v + 20; // error, b can't be modified. }(5); int d = [=](int v) mutable -> int { return a + b++ + v + 20; // ok. , b = 12 }(5); return b; // b = 11 }
按引用捕获
1 2 3 4 5 6 7 8 9 10
intbar() { int a = 10, b = 11; // 如果想要按引用捕获全部变量,可以在[]中只写一个"&" int c = [=, &b](int v) -> int { return a + b++ + v + 20; }(5); return b; // b = 12 }
如果想要按引用捕获全部变量,可以在[]中只写一个"&"
也可以在中括号只填一个"=",代表按值捕获全部
但是不能[=, &]既全部按值又全部按引用。同时存在时必须有一个是部分变量如[=, &b]
引用可以把外部值联动改变。
函数对象
可以用函数对象来存储定义的lambda函数。
不能用函数指针直接引用。
1 2 3 4 5 6 7 8 9 10
intbar() { int a = 10, b = 11; auto lambda = [=, &b](int v) -> int { return a + b++ + v + 20; }; returnlambda(5); }
#include<functional> intbar() { int a = 10, b = 11; std::function<int(int)> lambda = [=, &b](int v) -> int { return a + b++ + v + 20; }; returnlambda(5); }
lambda函数对象的生存周期
1 2 3 4 5 6 7 8 9 10 11 12 13 14
std::function<int(int)> bar() { int a = 10, b = 11; std::function<int(int)> lambda = [=, &b](int v) -> int { return a + b++ + v + 20; } } intmain() { auto lam = bar(); int r = lam(5); r = lam(5); }