为什么使用递归lambda时会遇到编译错误



我正在尝试定义递归lambda。

在其他语言中,例如GO,可以声明为:

func main() {
    var f func()
    f = func() { f() }
}

也许是由模板实现引起的?

#include <functional>
int main() {
  std::function<int()> f;
  int a = 0;
  f = [f,&a]() -> int {
    a++;
    if (a > 2) {
      return 1;
    }
    return f();
  };
  if (f() != 0) {
    goto out;
  }
  out:
  return 0;
}

这是我的编译器:

Apple LLVM version 10.0.1 (clang-1001.0.46.4)
Target: x86_64-apple-darwin18.6.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

您正在按值捕获f。您想通过参考来捕获递归lambda。这是一个示例递归lambda:

#include <functional>
#include <iostream>
int main() {
    std::function<int(int)> factorial;
    factorial = [&factorial](int i) {
        if (i < 2) {
            return 1;
        }
        return i * factorial(i - 1);
    };
    std::cout << "5! = " << factorial(5) << 'n';
}

std::function在大多数情况下都很好,但是如果您的递归lambda证明是性能瓶颈,那么您可以将lambda传递到自身中,并有一个额外的参数:

int a = 0;
auto f = [&a](auto&& go) -> int { //explicit return type is required here
  ++a;
  if (a > 2) { return 1; }
  return i * go(go);
};
f(f);

请注意,在lambda参数中,将lambda传递到lambda所需的 auto至少需要C 14。

最新更新