Style(1):lambda表达式

Lambda表达式

结构
//原型:
[ 捕获 ] ( 形参 ) { 函数体 }

//例子
auto capture_handler = [this](QWidget* widget, QString name) 
{
	callbacks_.capture_(parent_window_, widget, name);
};

//调用
QWidget* widget_; 
QString name_;
capture_handler(widget_,name_);


说明
  1. 捕获

    若变量满足下列条件,则 lambda 表达式可以不捕获就使用它

    • 该变量为非局部变量,或具有静态或线程局部存储期(该情况下无法捕获该变量),或者
    • 该变量为以常量表达式初始化的引用。

    若变量满足下列条件,则 lambda 表达式可以不捕获就读取其值

    • 该变量具有 const 而非 volatile 的整型或枚举类型,并已用常量表达式初始化,或者
    • 该变量为 constexpr 且无 mutable 成员。
  2. 返回值
    省略尾随返回类型:闭包的 operator() 的返回类型从 return 语句推导,如同对于声明返回类型为 auto 的函数的推导一样。

  3. 默认捕获

    • &(以引用隐式捕获被使用的自动变量)和

    • =(以复制隐式捕获被使用的自动变量)。

      void f(int, const int (&)[2] = {}) {} // #1
      void f(const int&, const int (&)[1]) {} // #2
      void test()
      {
          const int x = 17;
          auto g0 = [](auto a) { f(x); }; // ok:调用 #1,不捕获 x
          auto g1 = [=](auto a) { f(x); }; // C++14 中不捕获 x,C++17 中捕获 x
                                           // 捕获能被优化掉
          auto g2 = [=](auto a) {
                  int selector[sizeof(a) == 1 ? 1 : 2] = {};
                  f(x, selector); // ok:此为待决表达式,故 x 被捕获
          };
          auto g3 = [=](auto a) {
            typeid(a + x);  // 捕获 x,不管 a + x 是否为不求值操作数
          };
      }
      
      // C++14 起,lambda 能拥有自身的默认实参
      auto func1 = [](int i = 6) { return i + 4; };
      std::cout << "func1: " << func1() << '\n'; //10
      std::cout << "func1: " << func1(5) << '\n';//9int main()
      {
          std::vector<int> c = {1, 2, 3, 4, 5, 6, 7};
          int x = 5;
          c.erase(std::remove_if(c.begin(), c.end(), [x](int n) { return n < x; }), c.end());
       
          std::cout << "c: ";
          std::for_each(c.begin(), c.end(), [](int i){ std::cout << i << ' '; });
          std::cout << '\n';
       
          // 闭包的类型不能被指名,但可用 auto 提及
          // C++14 起,lambda 能拥有自身的默认实参
          auto func1 = [](int i = 6) { return i + 4; };
          std::cout << "func1: " << func1() << '\n'; //10
          std::cout << "func1: " << func1(5) << '\n'; //9
       
          // 与所有可调用对象相同,闭包能可以被捕获到 std::function 之中
          // (这可能带来不必要的开销)
          std::function<int(int)> func2 = [](int i) { return i + 4; };
          std::cout << "func2: " << func2(6) << '\n';
      }
      
比较函数指针,函数符和lambda函数

lambda的本身就是一个函数,那么与其他函数相对比lambda函数有何优势和劣势,距离,简洁,效率和功能

c++ 中lambda主要目的是,让你能够将类似于函数的表达式用作接受函数指针或函数符的参数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值