递归布尔lambda C ++

时间:2014-11-19 19:32:55

标签: c++ c++11 recursion lambda boolean

由于某种原因,这个lambda语句不想编译:

bool DepthFirstSearch = [](Graph *g, bool *ch, stack<int> &S, int v, int w) -> bool
{
 //Here is recursive DFS code
};

错误:no suitable conversion function from: "lambda[]bool()->bool" to bool exists

我的问题是为什么?

2 个答案:

答案 0 :(得分:1)

lambda的类型不是bool。您可以使用auto来完成此工作

auto DepthFirstSearch = [](Graph *g, bool *ch, stack<int> &S, int v, int w) -> bool { ... }

或使用std::function明确指定返回类型,但这非常麻烦。请参阅http://en.cppreference.com/w/cpp/utility/functional/function

通常使用auto更容易,否则每次更改lambda的参数时都必须更改变量的类型。

答案 1 :(得分:1)

如果你想让它递归,那么你必须捕获lambda(通过ref)。为此,您需要为其指定一个类型:

std::function<bool(Graph*, bool*, stack<int>&, int, int)> DepthFirstSearch = 
    [&](Graph *g, bool *ch, stack<int> &S, int v, int w) {
        // bunch of code here that possibly calls DepthFirstSearch
    };

你不能在这里做auto DepthFirstSearch = [=](...){...}因为lambda需要知道DepthFirstSearch的类型才能捕获它 - 如果你只是使用auto那么类型赢了直到处理lambda表达式之后才存在,这为时已晚。因此std::function<...>