我看过C++ lambda源码.
#include <functional>
#include <iostream>
int main()
{
std::function<int(int)> factorial;
// factorial = [factorial](int n)->int // runtime error
factorial = [&factorial](int n)->int // right
{
if (n == 1) {
return 1;
}
else {
return n * factorial(n - 1);
}
};
std::cout << factorial(5) << "\n";
}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么会发生运行时错误.
谢谢你的关注!
factorial = [factorial](int n)->int
Run Code Online (Sandbox Code Playgroud)
此版本factorial按值捕获.在lambda表达式factorial为空的时候,你得到一个空的副本,如果你试图调用它std::function,你会得到一个std::bad_function_call.将factorial = /*...*/;被分配给原有的对象,这是从用于关闭创建副本分开.
factorial = [&factorial](int n)->int
Run Code Online (Sandbox Code Playgroud)
此版本factorial通过引用捕获,即factorial在lambda内部命名与factorial外部相同的对象.因此,赋值factorial = /*...*/;会影响factoriallambda中的变量,因此您可以调用有效函数.