编写一个"记住"传入其中的值的Lambda函数

lac*_*chy 1 c++ c++11

我只是想知道如何在C++中编写一个Lambda函数,它"记住"下次调用它时传入的值?具体来说,我正在考虑i=iPython 的语法如下:

funs = [(lambda i=i: i) for i in range(10)]
Run Code Online (Sandbox Code Playgroud)

如果运行以下代码:

for i in range(len(funs)):
    print funs[i]()
Run Code Online (Sandbox Code Playgroud)

结果是:

0
1
4
9
16
Run Code Online (Sandbox Code Playgroud)

我也想知道技术名称(如果存在的话)是什么?(我知道,如果我知道第二个问题的答案,我可以通过Google获得解决方案......)

yep*_*ons 5

您可能正在寻找lambdas中的pass-by-value变量捕获.这是C++的默认设置.例:

#include <functional>
#include <iostream>
#include <vector>

int main() {
  std::vector<std::function<void(void)>> foo;
  for (int i = 0; i < 10; i++)
    foo.push_back(
      [i](){ std::cout << i << "\n"; }
    );
  for (const auto &f : foo)
    f();
}
Run Code Online (Sandbox Code Playgroud)

将打印数字从0到9.

请注意[i]语法.在C++中,您应列出将由lambda函数"看到"的所有局部变量.如果您只是在此处列出变量,则会复制其值.如果你用&(像[&i])列出它,那么它是通过引用传递的.显然,在后一种情况下,当捕获变量超出范围时,lambda将变为无效.

变量是在lambda创建时捕获的.