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

时间:2014-04-21 23:02:35

标签: c++ c++11 lambda

关于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;
}

2 个答案:

答案 0 :(得分:8)

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

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

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

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

答案 1 :(得分:3)

不捕捉任何东西的lambda在任何地方都可以安全使用。

如果它通过引用捕获,那么它在它所引用的对象的生命周期内是唯一安全的。

如果它按值捕获,那么它在任何地方都是安全的 - 它只是一个对象。