gpt4 book ai didi

c++ 11以下lambda函数的作用域是什么

转载 作者:太空狗 更新时间:2023-10-29 19:48:30 25 4
gpt4 key购买 nike

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

最佳答案

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

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

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

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

关于c++ 11以下lambda函数的作用域是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23207489/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com