【发布时间】:2016-01-23 15:48:57
【问题描述】:
我发现如果一个 lambda 是一个调用自身的递归函数,那么它不能被另一个 lambda 捕获为在 C++ 中的闭包中工作。
我有一些这样的代码:
#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();
}
};
【问题讨论】:
-
你正在通过引用捕获,
funcB在Setup完成后不再存在,所以是的,这不会很好地结束。 -
更改为按副本捕获无济于事...