我发现如果一个lambda是一个自我调用的递归函数,那么它不能被另一个lambda捕获为在C++中的闭包中工作。为什么我不能在C++中捕获递归lambda函数?
我有一些代码是这样的:
#include <memory>
#include <functional>
#include <iostream>
class ClassA
{
public:
std::function<void()> FuncA;
void Call()
{
FuncA();
}
};
class ClassB
{
std::unique_ptr<ClassA> pA = std::make_unique<ClassA>();
public:
void Setup()
{
std::function<void(int)> FuncB = [&](int a)
{
std::cout << "a = " << a << std::endl;
if(a > 0)
FuncB(a-1);
};
pA->FuncA = [&]()
{
FuncB(10.0f);
};
}
void Run()
{
Setup();
pA->Call();
}
};
int main() {
ClassB B;
B.Run();
}
运行调用FuncA的,当异常发生,因为在FuncB这将是一个空指针。
我的问题是为什么我不能捕获递归lambda函数?
我使用Visual Studio 2015年
编辑: 如果FuncA的通过复制捕获FuncB,那么它的工作原理,如果FuncB不是递归。像这样:
class ClassB
{
std::unique_ptr<ClassA> pA = std::make_unique<ClassA>();
public:
void Setup()
{
std::function<void(int)> FuncB = [FuncB](int a)
{
std::cout << "a = " << a << std::endl;
if (a > 0)
FuncB(a - 1);
};
pA->FuncA = [FuncB]()
{
FuncB(10.0f);
};
}
void Run()
{
Setup();
pA->Call();
}
};
你正在通过引用捕获,并且在'Setup'完成后'funcB'不再存在,因此这样做不会很好地结束。 –
更改为通过复制进行捕获无助于... – Clones1201