【问题标题】:c++11 what is the scope for the lambda function belowc++11下面的lambda函数的作用域是什么
【发布时间】:2014-04-21 23:02:34
【问题描述】:

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

【问题讨论】:

  • 你的fx() 函数创建了一个r-value 变量,其作用域持续main()
  • @cmbasnett 谢谢,但我知道的很多,我在问编译器创建的 lambda 对象本身创建的范围是什么

标签: c++ c++11 lambda


【解决方案1】:

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

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

了解了这一切,我们可以对您发布的代码说以下几点:

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

【讨论】:

  • +1 此语句有助于“在这些情况下,假设运算符 () 只是调用一个静态函数(并且隐式转换是指向该静态函数的指针)。”
【解决方案2】:

不捕获任何内容的 lambda 在任何地方都可以安全使用。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    相关资源
    最近更新 更多