关于lambda函数的快速问题。我看到当使用gcc编译器时,如果它没有捕获,则会对lambda的operator()函数的函数指针进行隐式转换。结果看下面这个淡化的例子我应该期望这个函数的生命时间可用于回调? lambda函数的定义范围是什么?本地范围,包装范围,全球范围?在这种情况下函数退出后调用lambda有什么问题吗?我根本不想在这里使用std :: function,所以请不要使用std :: function返回值作为解决方案。我的问题只是理解该函数的范围(没有捕获),以及它是否可用于程序的生命周期。
#include <iostream>
typedef int(*fPtrT)(int,int);
fPtrT fx() {
return static_cast<fPtrT>([](int i, int j){return i+j;});
}
int main()
{
std::cout << fx()(5,2) << std::endl;
}
答案 0 :(得分:8)
lambda表达式返回匿名定义的类的实例(该类型仅为编译器所知)。此类重载operator ()
以充当function object。
最重要的是,不关闭任何状态的lambda表达式都有添加的规范,它们可以隐式转换为C风格的函数指针。在这些情况下,假设operator ()
只调用一个静态函数(隐式转换是指向该静态函数的指针)。
了解所有这些,我们可以说出您发布的代码的以下内容:
fx
函数时,都会创建一个匿名类的实例
fx
函数返回的函数指针实际上是指向静态函数的指针答案 1 :(得分:3)
不捕捉任何东西的lambda在任何地方都可以安全使用。
如果它通过引用捕获,那么它在它所引用的对象的生命周期内是唯一安全的。
如果它按值捕获,那么它在任何地方都是安全的 - 它只是一个对象。