【发布时间】:2013-06-13 16:02:44
【问题描述】:
与常规递归函数相比,递归 lambda 函数是否会产生任何开销(因为我们必须将它们捕获到 std::function 中)?
此功能与仅使用常规功能的类似功能有什么区别?
int main(int argc, const char *argv[])
{
std::function<void (int)> helloworld = [&helloworld](int count) {
std::cout << "Hello world" << std::endl;
if (count > 1) helloworld(--count);
};
helloworld(2);
return 0;
}
【问题讨论】:
-
您的主要问题将是编译器优化较少ideone.com/QsZVfH
-
不错!你知道为什么吗?编译器不能只是猜测这段代码类似于常规函数调用(没有捕获但它本身)?
-
@fscan 我必须这样做,因为它是一个递归 lambda 函数。类型推断在这里不起作用
-
对不起,不知道这个特殊情况,将删除评论。
-
我看到一个 lambda 闭包,它通过引用调用
std::function,而不是递归 lambda。然后由闭包分配std::function。std::function不是 lambda 闭包,lambda 闭包也不是std::function。 Lambda 闭包可以存储在std::functions 中,闭包可以通过引用或值捕获std::functions。 lambda 闭包实际上递归调用自身(而不是通过某些中介)的能力目前在 C++11 中不可用......从某种意义上说,这比递归 lambda 更好地描述为“递归std::function” .