【发布时间】:2020-04-05 09:05:18
【问题描述】:
我正在尝试使用带有 auto 关键字的递归 lambda 函数,如下所示。
#include <iostream>
using namespace std;
int main()
{
auto func = []()->void{
static int x = 0;
cout << x << endl;
if (x < 5) {
func();
x++;
}
};
func();
return 0;
}
但它抛出编译器错误如下。
main.cpp: In lambda function:
main.cpp:19:13: error: use of ‘func’ before deduction of ‘auto’
func();
^~~~
我知道我们可以使用 std::function 实现相同的效果。但我想知道为什么使用“auto”会出错。
我经历了下面的堆栈溢出问题。
但我无法弄清楚为什么在这种情况下使用 lambda 的 auto 会引发错误。谁能告诉我为什么会出现这个错误?
【问题讨论】:
-
错误信息不是很清楚吗?
auto在初始化的右侧被处理之前确定。 -
@JasperKent:我通过错误消息理解了这一点。但我已经明确使用“void”作为返回类型。那为什么编译器无法确定这里是什么。
-
顺便说一句:如果 lambda 定义并传递给 var,那么它没有捕获任何东西有什么意义。在这种情况下,每个“正常”功能都更适合。我在这个例子中看到的是对 lambda 的滥用。 lambda 作为给定算法的临时函数对象参数非常好。但是滥用它作为一个正常的功能只会降低代码的可读性。我的意见:-)
-
@kadina 正如我所说,因为它必须评估整个右侧
-
@Klaus:我知道在这种情况下它没有多大意义 :) 我只是想了解为什么这不起作用。所以没用capture,写了个简单的。