我可以轻松做到这一点:

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/

10-11 23:03
查看更多