赞
踩
C++11引入了Lambda表达式,用于定义并创建匿名的函数对象,主要用于方便编程,避免全局变量的定义,并且变量安全。
Lambda表达式的定义语法如下:
[函数对象参数](函数参数)修饰符->返回值类型{函数体};
[]标识一个Lambda表达式的开始,这一部分是不可以忽略的。函数对象参数只能使用到定义该Lambda表达式为止定义过的局部变量,包括Lambda表达式所在类的成员变量。函数参数有以下几种形式:
这一部分可以被省略(如果函数无参数),我们可以使用下面方式定义Lambda表达式
auto f = [] {
cout << "Hello" << '\n';
};
也可以使用下面的方式定义Lambda表达式
auto f = [] (string s) {
cout << "Hello " << s << '\n';
};
这一部分是可以省略的,常见的修饰符有两个,一个是mutable,另一个是exception
int x = 1;
auto test = [x] () { x++; };
test();
这样会报错,参数x是值传递的方式,是一个只读变量,但是我们加入mutable后,就不会报错
int x = 1;
auto test = [x] () mutable { x++; cout << x << ' '; };
test();cout << x << '\n';
这样我们就过了编译,不妨猜猜输出结果,是2 2还是2 1呢?
答案是2 1,注意上边加黑的字体:被mutable修饰的函数参数,该函数参数可以在函数体内改变,也就是说不会改变函数体外该变量的值,我们也可以理解为在函数体内拷贝了这个变量的同名变量。
这一部分也是可以省略的,Lambda表达式会自动推断返回值类型,但是返回类型不统一会报错;
标识函数的实现,这一部分可以为空,但是不能省略。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。