当前位置:   article > 正文

C++Lambda表达式,超详细的讲解,保证一遍懂_c++ lambda

c++ lambda

1、Lambda表达式的概述

C++11引入了Lambda表达式,用于定义并创建匿名的函数对象,主要用于方便编程,避免全局变量的定义,并且变量安全。

Lambda表达式的定义语法如下:

[函数对象参数](函数参数)修饰符->返回值类型{函数体};
  • 1

2、Lambda表达式语法分析

2.1 函数对象参数

[]标识一个Lambda表达式的开始,这一部分是不可以忽略的。函数对象参数只能使用到定义该Lambda表达式为止定义过的局部变量,包括Lambda表达式所在类的成员变量。函数参数有以下几种形式:

  • 空:代表不捕获Lambda表达式外的变量;
  • &:代表以引用传递的方式捕获Lambda表达式外的变量;
  • =:代表以值传递的方式捕获Lambda表达式外的变量,即以const引用的方式传值;
  • this:表示Lambda表达式可以使用Lambda表达式所在类的成员变量;
  • a或=a:表示以值引用的方式传递变量 a a a,即const int a,在函数体内不可改变a的值;但是可以对Lambda表达式使用mutable修饰符修饰,使得函数对象参数可以进行赋值,但是该函数对象参数不是被修改为引用传递方式,下面进行细说;
  • &a:表示以引用传递的方式传递变量 a a a,在函数体内可以改变a的值;
  • x,&y:x为值传递方式,y为引用传值方式;
  • =,&x,&y:除x,y为引用传递方式以外,其他参数都为值传递方式进行传递;
  • &,x,y:除x,y为值传递方式以外,其他参数都为引用传递方式进行传递;

2.2 函数参数

这一部分可以被省略(如果函数无参数),我们可以使用下面方式定义Lambda表达式

auto f = [] {
	cout << "Hello" << '\n';
};
  • 1
  • 2
  • 3

也可以使用下面的方式定义Lambda表达式

auto f = [] (string s) {
	cout << "Hello " << s << '\n';
};
  • 1
  • 2
  • 3

2.3 修饰符

这一部分是可以省略的,常见的修饰符有两个,一个是mutable,另一个是exception

  • mutable:当函数参数以值引用传递方式传递时,在函数体内是不可以修改该函数参数的值的,我们可以使用mutable修饰符,使得该函数参数可以在函数体内改变,下面我们实验一下
int x = 1;
auto test = [x] () { x++; };
test();
  • 1
  • 2
  • 3

这样会报错,参数x是值传递的方式,是一个只读变量,但是我们加入mutable后,就不会报错

int x = 1;
auto test = [x] () mutable { x++; cout << x << ' '; };
test();cout << x << '\n';
  • 1
  • 2
  • 3

这样我们就过了编译,不妨猜猜输出结果,是2 2还是2 1呢?

答案是2 1,注意上边加黑的字体:被mutable修饰的函数参数,该函数参数可以在函数体内改变,也就是说不会改变函数体外该变量的值,我们也可以理解为在函数体内拷贝了这个变量的同名变量。

  • exception:exception 声明用于指定函数抛出的异常,如抛出整数类型的异常,可以使用 throw(int)。

2.4 返回值类型

这一部分也是可以省略的,Lambda表达式会自动推断返回值类型,但是返回类型不统一会报错;

2.5 函数体

标识函数的实现,这一部分可以为空,但是不能省略。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/332409
推荐阅读
相关标签
  

闽ICP备14008679号