在递归lambda中捕获值

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)

发生分段错误.

有人可以解释为什么通过引用捕获工作而按值捕获会给出分段错误.

Rei*_*ica 8

按值捕获将作为评估lambda表达式的一部分进行评估.那个时候,fun仍然没有初始化,因为你还在评估它的初始化.只有在fun初始化之后,但到那时复制已经发生.

实际效果是存储在里面的lambda函数对象fun有一个名为的数据成员fun,它是未经初始化的std::function- 未定义行为的副本.