lambda表达式是C++11新推出来的一个概念,非常好用,但如同C++的其他知识点一样,坑也很多。
想要比较全面的介绍lambda,放到一篇博客中会比较臃肿,故决定用两篇介绍。本篇重点介绍lambda的简单应用,另一篇着重介绍lambda的坑。
进入正题!
lambda可以理解成局部函数,即函数中定义一个函数,与STL算法搭配使用,会极其方便。可以这么说,有了lambda,STL如虎添翼。
但是!lambda也可以定义成全局的,即不在函数内定义。但这种做法有违了lambda的设计初衷,直接用普通函数就好。
其语法格式如下:
[捕获列表] (参数列表) -> 返回值类型 { 函数体 }
其中,仅有“[]{}”是必须的,其他全部可以省略不写。lambda的使用,和函数类似,先要定义,然后调用。
简单的示例代码如下:
auto lam_global = []{std::cout << "全局" << std::endl; }; //函数体外定义的lambda,虽然合法,但不建议这么做,用普通函数即可
int _tmain(int argc, _TCHAR* argv[])
{
using namespace std;
auto lam_empty = []{}; //最简单的Lambda表达式,什么都不做
auto lam_print = []{cout << "简单lambda" << endl; };
lam_empty();
lam_print();
lam_global();
system("pause");
return 0;
}
执行结果如下:
上面用的是auto关键字定义的变量名来接受lambda表达式,用函数指针也可以:
using Fun = void(*)(void);
Fun fun = []{cout << "yes" << endl; };
fun();
建议统一用auto,交由编译器完成类型推断!
下面一一解释各部分。
参数列表
1、参数列表和普通函数的参数列表一样,可以是值、引用、const引用等,也是作为形参;
2、如果是非const引用,函数体内部可以修改引用的值;
3、与普通函数不同,lambda表达式的参数不能有默认值。
示例代码如下: