C++ Lambda函数-按值捕获

C++ Lambda函数-按值捕获,c++,lambda,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 <<

为什么这会导致分割错误

#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;
}

我已经添加了可变关键字。不应该忽略价值工作吗?为什么这需要通过引用传递?是因为我递归调用hcf吗

闭包对象在hcf之前初始化,因为它是hcf的初始值设定项。即使您的代码不会调用UB,您仍然会将hcfs的“仍然为空”状态复制到closure对象的成员变量中。随后调用它将导致调用一个空函数


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

closure对象在hcf之前初始化,因为它是hcf的初始值设定项。即使您的代码不会调用UB,您仍然会将hcfs的“仍然为空”状态复制到closure对象的成员变量中。随后调用它将导致调用一个空函数


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

在未初始化的点通过值hcf捕获听起来不是一个好主意您没有提供错误消息。有趣的是,它对我来说毫无错误。虽然我想知道它是如何通过拷贝捕获cout的,但这不应该被删除吗?这个问题不应该被否决,它可能会成为一个常见的问题soon@Galik:std::cout是一个全局实例,不需要捕获。它可以编译,但应该抛出异常std::bad_function_callI我想我现在明白了。它使用cout而不捕获cout,这是一个很大的线索,可以解释为什么它作为全局lambda而不是本地lambda工作。当它是全局的时,它可以调用自己,而不必捕获自己。当它在本地时,它需要捕获自己来调用自己,因此通过拷贝捕获是有问题的!在未初始化的点捕获hcf值听起来不是一个好主意您没有提供错误消息。有趣的是,它对我来说毫无错误。虽然我想知道它是如何通过拷贝捕获cout的,但这不应该被删除吗?这个问题不应该被否决,它可能会成为一个常见的问题soon@Galik:std::cout是一个全局实例,不需要捕获。它可以编译,但应该抛出异常std::bad_function_callI我想我现在明白了。它使用cout而不捕获cout,这是一个很大的线索,可以解释为什么它作为全局lambda而不是本地lambda工作。当它是全局的时,它可以调用自己,而不必捕获自己。当它在本地时,它需要捕获自己来调用自己,因此通过拷贝捕获是有问题的!