这篇文章主要为大家展示了“C++中Lambda表达式有什么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C++中Lambda表达式有什么用”这篇文章吧。
C++ 11 中的 Lambda 表达式用于定义并创建匿名的函数对象,以简化编程工作。Lambda
的语法形式如下:
[捕获列表] (参数) mutable 或 exception 声明 -> 返回值类型 {函数体} //计算两个值的和 auto func = [](int a, int b) -> int{return a+b;}; //当返回值的类型是确定时,可以忽略返回值 auto func = [](int a, int b){return a + b;}; //调用 int sum = func(1, 3);
Lambda 表达式相当于一个类,那么捕获列表就是传递给这个类的类成员。比如:
class Labmda { public: const int test; Labmda(int value):test(value) { } public: int run(int a, int b) { return a + b + test; } } int main() { int test = 10; auto func = Labmda(test); int sum = func.run(1, 3); } //使用Lambda 表达式的写法 int main() { int test = 10; auto func = [test](int a, int b){return a + b + test;}; int sum = func(1, 3); }
捕获列表有以下格式:
格式 | 描述 |
---|---|
[] | 不带任何参数 |
[=] | Lambda表达式之前的局部变量,包括所在类的this,变量按值方式传递 |
[&] | Lambda表达式之前的局部变量,包括所在类的this,变量按引用方式传递 |
[this] | Lambda表达式所在类的this |
[a] | Lambda表达式之前的局部变量a的值,也可以传入多个值,如[a , b] |
[&a] | Lambda表达式之前的局部变量a的引用 |
关键字声明一般都很少用到,也不建议随便使用,可以忽略不计。
mutable
当捕获列表以值的方式传递时有效,加上此关键字后,可以修改Lambda类成员(带const修饰符)。比如:
int test = 10; //编译报错,test成员不能修改 auto func = [test](int a, int b){test = 8; return a + b + test;}; //编译正常 auto func = [test](int a, int b)mutable {test = 8; return a + b + test;};
这里需要注意的是:Lambda类成员test
修改之后,并不会改变外部int test
的值。
exception
exception 声明用于指定函数抛出的异常,如抛出整数类型的异常,可以使用 throw(int)
int test = 10; auto func = [=](int a, int b){return a + b + test;}; auto func2 = [test](int a, int b){return a + b + test;}; int sum = func(1, 3); //sum等于14
这里需要注意的是func
表达式中test
的值只更新到表达式之前:
int test = 10; auto func = [=](int a, int b){return a + b + test;}; test = 5; int sum = func(1, 3); //sum还是等于14
int test = 10; auto func = [&](int a, int b){test = 5; return a + b + test;}; auto func2 = [&test](int a, int b){test = 5; return a + b + test;}; int sum = func(1, 3); //sum等于9,test等于5
这里func
表达式中test
的值就能随时更新:
int test = 10; auto func = [&](int a, int b){return a + b + test;}; test = 5; int sum = func(1, 3); //sum等于9,test等于5
以上是“C++中Lambda表达式有什么用”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。