Din*_*rya 4 c++ recursion lambda c++11
我们可以定义递归lambda函数
std::function<void(int)> fun = [&fun](int a) { if (a) fun(a - 1); };
Run Code Online (Sandbox Code Playgroud)
然后我们可以用它来调用它
fun(10);
Run Code Online (Sandbox Code Playgroud)
但是,如果我将定义更改为
std::function<void(int)> fun = [fun](int a) { if (a) fun(a - 1); };
Run Code Online (Sandbox Code Playgroud)
然后尝试用它来打电话
fun(10);
Run Code Online (Sandbox Code Playgroud)
发生分段错误.
有人可以解释为什么通过引用捕获工作而按值捕获会给出分段错误.
按值捕获将作为评估lambda表达式的一部分进行评估.那个时候,fun仍然没有初始化,因为你还在评估它的初始化.只有在fun初始化之后,但到那时复制已经发生.
实际效果是存储在里面的lambda函数对象fun有一个名为的数据成员fun,它是未经初始化的std::function- 未定义行为的副本.