C++ Lambda 函数与表达式

C++11 提供了对匿名函数的支持,称为 Lambda 函数( 也叫 Lambda 表达式 )

Lambda 表达式函数 看作 对象

Lambda 表达式 可以像对象一样使用, 可以将它们赋给变量和作为参数传递,还可以像函数一样对其求值

Lambda 表达式声明

声明 Lambda 表达式与函数声明非常类似

Lambda 表达式的声明形式如下

[capture](parameters) -> return-type
{ 
   //body
}
  1. capture 是可选的,后面讲如何使用
  2. parameters 为表达式的参数,类似于函数中的形参
  3. return-type 返回值类型

例如下面的代码声明了一个比较 int 类型变量 x,y 大小的 Lambda 表达式

[](int x, int y) -> bool { return x < y ; }

如果 lambda 函数没有传回值 ( 例如 void ) ,回返类型可被完全忽略

[capture](parameters){
   // body
}

如果连参数不需要传递,还可以写成

[capture](){
   // body
}

例如

[]{ ++global_x; }

我们来看看一个更复杂的代码

[](int x, int y) -> int { int z = x + y; return z + x; }

一个临时的参数 z 被创建用来存储中间结果

如同一般的函数,z 的值不会保留到下一次该不具名函数再次被调用时

Lambda 表达式中的 [capture]

Lambda 表达式内可以访问当前作用域的变量,这是 Lambd a表达式的闭包 (Closure ) 行为

因为 C++ 变量传递有传值和传引用的区别,所以使用当前作用域内的变量方式可以通过前面的 []来指定

capture 说明
[] 沒有定义任何变量。使用未定义变量会引发错误
[x, &y] x 以传值方式传入(默认),y 以引用方式传入
[&] 任何被使用到的外部变量都隐式地以引用方式加以引用
[=] 任何被使用到的外部变量都隐式地以传值方式加以引用
[&, x] x 显式地以传值方式加以引用。其余变量以引用方式加以引用
[=, &z] z 显式地以引用方式加以引用。其余变量以传值方式加以引用

对于 [=][&] 形式,lambda 表达式可以直接使用 this 指针

但是,对于 [] 形式,如果要使用 this 指针,必须显式传入

[this]() { this->someFunc(); }();

C++ 基础教程

关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.