t& Num){return ((Num % Divisor ) == 0);}
一系列以状态变量的方式传递的参数,也被称为lambda表达式的捕获列表。
6. lambda表达式的通用语法
[StateVar1,StateVar1](Type& param) { // }
如果要在lambda表达式中修改这些状态变量,可添加关键字multable:
[StateVar1, StateVar1](Type& param) multable { // }
这样便可在lambda表达式中修改捕获列表[]中指定的变量,但离开lambda表达式后,这些修改便无效,要确保在lambda表达式内部对状态变量的修改在其外部也有效,应按照引用传递它们:
[&StateVar1, &StateVar1](Type& param) { // }
lambda表达式还可以接受多个输入参数,为此可用逗号分隔:
[StateVar1, StateVar1](Type1& param1,Type2& param2) { // }
如果要向编译器明确指明返回类型,可使用->,如下:
[StateVar1, StateVar1](Type1& param1,Type2& param2)-> ReturnType { return (value or expression); }
最后,复合语句{}可包含多条用分号分割的语句:如下
[StateVar1, StateVar1](Type1& param1,Type2& param2)-> ReturnType { Statement 1; Statement 2;return (value or expression); }
如果lambda表达式包含多行代码,必须显示地指明返回类型。
7. 二元函数对应的lambda表达式
二元函数接受两个参数,还可返回一个值,与之等价的lambda表达式如下:
[...] (Type1& param1,Type2& param2){ // }
8. 二元谓词对应的lambda表达式
返回true或false,可帮助决策的二元函数被称为二元谓词函数。这种谓词可用于std::sort等排序算法。
[...] (Type1& param1,Type2& param2){ return bool expression; }
9. 总结
仅当lambda表达式简洁、高效时才能使用它;
记住lambda表达式总是以[]打头;
除非使用关键字multable进行指定,否则不能修改捕获列表中指定的状态变量;
lambda表达式是实现了operator()的匿名类或结构;
注意使用const对参数进行限定;
lambda表达式的语句块包含多条语句时,要显式的指定返回类型;
不要使用很长的包含多条语句的lambda表达式,而应转而使用函数对象,因为每次使用lambda表达式时,都要重新定义它,这无助于提高代码的重用性。
?