C++ lambda错误

bla*_*pup 1 c++ lambda

我看过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)

我不明白为什么会发生运行时错误.
谢谢你的关注!

Tar*_*ama 5

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中的变量,因此您可以调用有效函数.