Lambda函数 - 按值捕获

时间:2014-10-13 17:13:45

标签: c++ lambda

为什么会导致分段错误?

#include <iostream>
#include <functional>
using namespace std;

int main() {

     function<int(int,int)> hcf = [=](int m, int n)mutable->int{
    // cout << "m: " << m << " n: " << n << endl;
    if(m<n) return hcf(n,m);
    int remainder(m%n);
    if(0 == remainder) return n;
    return hcf(n,remainder);
};

    cout << hcf(10,15) << endl;

    return 0;
}

我添加了mutable关键字。不应该通过价值传递工作吗?为什么这需要传递引用?是因为我递归地呼叫hcf吗?

1 个答案:

答案 0 :(得分:5)

闭包对象在hcf之前初始化,因为它是hcf的初始化程序。即使您的代码不会调用UB,您仍然会将hcf仍然为空的状态复制到闭包对象的成员变量中。随后调用它将导致调用空function

当您通过引用捕获时,这不再是问题,因为首次使用引用(即第一次调用闭包对象),hcf已经正确初始化。