从C++14 开始,可在 Capture 子句中引入并初始化新的变量,而无需使这些变量存在于 Lambda 函数的封闭范围内。 初始化可以任何任意表达式表示;且将从该表达式生成的类型推导新变量的类型。
下面的代码展示了一个斐波那契数列生成器,其中使用了 Lambda 函数作为状态机。
#include <iostream>
#include <utility>
using namespace std;
int main() {
auto fib = [i = 0, j = 1]() mutable {
i = std::exchange(j, i + j);
return i;
};
for (int i = 0; i < 10; i++) {
cout << fib() << ", ";
}
return 0;
}
fib
会不断生成新的斐波那契数列项。每次调用 fib
函数时,i
和 j
都会被更新。
运行结果如下:
1, 1, 2, 3, 5, 8, 13, 21, 34, 55,
由此可见,Lambda 函数可以作为状态机使用,而无需在封闭范围内声明额外的变量。
参考链接: