我發現如果一個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