[](){}是一个C++11下的Lambda表达式(匿名函数),当然[]{}也是一个Lambda表达式。
1. Lambda表达式区别
Lambda表达式可以像对象一样使用,比如可以将它们赋给变量和作为参数传递,还可以像函数一样具有返回值。Lambda表达式本质上与函数声明非常类似。lambda可以转换为std::function函数,但是它又与类型有所区别。使用typeid获取类型名字即使是相同的表达式,它们的名字也会不一样。
typeid([](){}).name();
typeid([](){}).name();
2. Lambda表达式写法
(1) Capture子句,在 C++ 规范中也称为 lambda 引导;
[]不捕获任何变量;
[&]捕获外部作用域中所有变量,并作为引用在函数体中使用(按引用捕获);
[=]捕获外部作用域中所有变量,并作为副本在函数体中使用(按值捕获)。
(2) 参数列表(可选),也称为 lambda 声明符;
(3) 可变规范(可选);
(4) 异常规范(可选),可以填mutable, exception, attribute;
mutable: 说明lambda表达式体内的代码可以修改被捕获的变量,并且可以访问被捕获的对象的non-const方法;
exception: 说明lambda表达式是否抛出异常以及何种异常;
attribute: 用来声明属性。
(5) 尾随返回类型(可选);
(6) "Lambda 体"。
3. Lambda表达式的使用示例
(1) 通过std::function转换使用;
std::function<int(int)> square = [](int i) -> int { return i * i; };
square(1);
(2) 通过auto转换使用:
auto square = [](int i) -> int { return i * i; };
square(1);
(3) 直接使用:
[](int i) -> int { return i * i; }(1);
4. 使用Lambda表达式的简洁之道
(1) 使用lambda表达式实现自定义排序;
std::array<int, 10> s = {5, 7, 4, 2, 8, 6, 1, 9, 0, 3};
std::sort(s.begin(), s.end(), [](int a, int b) {
return a > b;
});
(2) 可以实现简化代码,不再需要重新定义函数体再调用;
最后,由于lambda特性较多,在使用方便的同时实则会增加使用的难度,后续会在开源网络库(历史图文可以看到该库的相关知识)中加入lambda支持。