我可以轻松做到这一点:
auto f = []()->int { return 4; };
auto g = [f]()->int { return f(); });
int i = g();
但是,我不能这样做:
int (*f)() = []()->int { return 4; };
int (*g)() = [f]()->int { return f(); });
int i = g();
为什么我在MSVC中收到这样的消息?
error C2440: 'initializing' : cannot convert from 'ClassName::functionName::< lambda_b2eebcdf2b88a20d8b40b0a03c412089>' to 'int (__cdecl *)(void)'
这发生在线:
int (*g)() = [f]()->int { return f(); });
如何正确地做到这一点?
最佳答案
int (*f)() = []()->int { return 4; };
仍然很好,因为具有空捕获列表的lambda隐式转换为匹配的函数指针。
但是,第二行不满足此(关键)条件:
int (*g)() = [f]()->int { return f(); });
^
因此转换失败。
如果要存储捕获某些内容的lambda,则需要
std::function
,或者像以前一样使用auto
推断类型;任何适合您的用例的东西。函数指针根本无法做到这一点(在C++ 11中,有关将来的信息,请参见Yakk's answer)。关于c++ - Lambda调用另一个外部Lambda,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39731302/