c ++ 11下面的lambda函数的范围是什么

bja*_*fly 3 c++ lambda c++11

关于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;
}
Run Code Online (Sandbox Code Playgroud)

Lil*_*ste 8

lambda表达式返回匿名定义的类的实例(该类型仅为编译器所知).此类重载operator ()以充当函数对象.

最重要的是,不关闭任何状态的lambda表达式具有添加的规范,它们可以隐式转换为C风格的函数指针.在这些情况下,假设operator ()刚刚调用一个静态函数(并且隐式转换是指向该静态函数的指针).

了解了所有这些,我们可以说出您发布的代码的以下内容:

  • 每次fx调用该函数时,都会创建一个匿名类的实例
    • 这个例子是一个r值; 因此它只存在于声明结束之前
  • 函数返回的函数指针fx实际上是指向静态函数的指针
  • 任何拥有它的人都可以安全地使用函数指针(因为它是一个没有共享状态的静态函数)