帖子摘要:1、Lambda表达式 C 11中的Lambda表达式用于定义并创建匿名的函数对象以简化编程工作。 Lambda的语法形式如下 [函数对象参数](操作符重载函数参数) mutable或exceptio......" P& Y1 x! X) r / _% a) ]% p! C* W) Q! j$ i大家好,欢迎来到Java吧(www.java8.com),交流、学习Java技术、获取Java资源无任何套路,今天说一说:“C++ Lambda表达式详解” 0 d/ f) M. }% k- t3 \1 n. J% e9 U( R
) _/ Z) f+ ]! E: n z
7 J- \' U. R- a9 N6 v9 H1 m' A ; c3 q- M# f; t- q% B 1、Lambda表达式 , F7 D9 r' E. [% t% uC++ 11中的Lambda表达式用于定义并创建匿名的函数对象以简化编程工作。! K w( _3 ]* G
+ ^4 F$ J7 y+ S8 d' c) j Lambda的语法形式如下 6 Y; a$ p$ g, g 6 t1 |' L: |7 W1 B[函数对象参数](操作符重载函数参数) mutable或exception声明->返回值类型{ 函数体 } " @( l/ u# q7 q7 i9 I 0 n/ u$ p$ V% _) {7 |可以看到Lambda主要分为五个部分- A1 Y G1 b' B, I) c
g V1 q6 R; d/ Z$ L. r0 X% j[函数对象参数]、(操作符重载函数参数)、mutable或exception声明、->返回值类型、{ 函数体 }。1 J- \+ R; m8 \/ M+ @; q3 {
6 B* @$ e' p J) B5 \ 具体如下! e8 X' X& m. _
+ ]5 i1 ~* d; Z; p$ b! G
一、[函数对象参数]标识一个Lambda的开始这部分必须存在不能省略。函数对象参数是传递给编译器自动生成的函数对象类的构造函数的。0 [) h3 |) c* I6 ^3 W5 Z: F& y' L, \
5 A7 l! }, @5 ?1 U9 m
函数对象参数只能使用那些到定义Lambda为止时Lambda所在作用范围内可见的局部变量包括Lambda所在类的this。 1 x& z5 Z: Y6 n k6 \2 q# | 0 p! j4 d. M) t7 }+ T c# @ 函数对象参数有以下形式 # f0 l: L" [2 ]. b, ^ 4 ?7 _. C! M6 E! K
1、空。没有使用任何函数对象参数。- G/ H7 r) ?" K3 ~+ n0 J1 t+ Y
4 S% ?" |; y# p2 M1 R2、 = 。函数体内可以使用Lambda所在作用范围内所有可见的局部变量包括Lambda所在类的this并且是值传递方式相当于编译器自动为我们按值传递了所有局部变量。+ l% n' @" K# m0 Y
- K! ]; C: U3 R6 ~
3、&。函数体内可以使用Lambda所在作用范围内所有可见的局部变量包括Lambda所在类的this并且是引用传递方式相当于编译器自动为我们按引用传递了所有局部变量。9 D7 p0 K' f8 @4 J
3 ~" E5 n! A' j
4、this。函数体内可以使用Lambda所在类中的成员变量。+ N2 M+ E/ x; V! E* a
* q% s1 T; y/ L. S; M. X1 `- V5、a。将a按值进行传递。按值进行传递时函数体内不能修改传递进来的a的拷贝因为默认情况下函数是const的。要修改传递进来的a的拷贝可以添加mutable修饰符。 " b4 f/ M8 M6 Q* F& ^# V: x+ N8 R 7 G) s1 ` v9 M2 t% t5 n6 [: B6、&a。将a按引用进行传递修复修改a。 ( Q1 _+ Q; f7 T; J' {0 d* D/ w " a* z! G* g% i5 I# _* f, ^7、a, &b。将a按值进行传递b按引用进行传递。1 A2 d2 j8 s) `
* z1 p. }) H' l2 V& g
8、 = &a, &b。除a和b按引用进行传递外其他参数都按值进行传递。/ K' I v3 \, I7 ~7 T) i
2 t9 u, y1 |( K: `7 T2 D4 Y& q8 _
9、&, a, b。除a和b按值进行传递外其他参数都按引用进行传递。 * j: Q. j X4 d) J1 K 1 P( H* E* h" u; x' K( b二、(操作符重载函数参数)标识重载的()操作符的参数没有参数时这部分可以省略。参数可以通过按值如(a, b)和按引用如(&a, &b)两种方式进行传递。 4 q3 K+ U* Q$ G. A- ~$ n4 T/ S 5 y2 j; A1 R& K3 i7 J
三、mutable或exception声明这部分可以省略。按值传递函数对象参数时加上mutable修饰符后可以修改按值传递进来的拷贝注意是能修改拷贝而不是值本身。 1 G2 b0 w- o/ d3 K. B& t 4 m1 M+ `2 m2 g0 R M' b1 ^6 wexception声明用于指定函数抛出的异常如抛出整数类型的异常可以使用throw(int)。5 e. U: y2 N' Y4 C C3 w }3 I! b
# r% T! k% k. l' B. q
四、->返回值类型标识函数返回值的类型当返回值为void或者函数体中只有一处return的地方此时编译器可以自动推断出返回值类型时这部分可以省略。( K5 w& j. w1 D6 X9 H' [
4 M2 h }8 ~, D2 x五、{ 函数体 }标识函数的实现这部分不能省略但函数体可以为空。+ b, P3 i" }" K. y7 X, s
$ C$ f3 G# F7 \( E. L7 J
2、示例 % n' d, X5 r, u( A
1简单示例* n8 R% E0 f: W