可能重复:
c++0x 中的递归 lambda 函数
如果我把它写成,为什么我不能递归地调用 lambda:
auto a = [&]
{
static int i = 0; i++;
std::cout << i << std::endl;
if (i<10)
a(); //recursive call
};
它给出了编译错误(ideone):
prog.cpp:8:18: error: '((const main()::<lambda()>*)this)->main()::<lambda()>::a' cannot be used as a function
prog.cpp: In function 'int main()':
prog.cpp:9:9: error: variable 'auto a' with 'auto' type used in its own initializer
错误是什么意思?
我明白我不能写这个的原因:
auto i=i+1; //error: unable to deduce 'auto' from '<expression error>'
我们不能这样写,因为必须从它的初始化中推断出类型,这意味着如果它本身出现在初始化(ideone)中i
,就无法推断出类型。但是在 lambda 的情况下有什么关系呢?如果我没记错的话,lambda 的类型是由它的参数和返回类型决定的;如果它不返回任何内容,则它不依赖于主体(在这种情况下,无论 lambda-body 中的其他语句如何,都将返回类型推导出为 )。i
void
无论如何,我有一个解决方法,我可以使用std::function
:
std::function<void()> a = [&]
{
static int i = 0; i++;
std::cout << i << std::endl;
if (i<10)
a();
};
编译罚款(ideone)。但我仍然有兴趣知道该auto
版本无法编译的原因。