栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

1、Lambda表达式的概述

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

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

[函数对象参数](函数参数)修饰符->返回值类型{函数体};
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';
};

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

auto f = [] (string s) {
	cout << "Hello " << s << 'n';
};
2.3 修饰符

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

  • mutable:当函数参数以值引用传递方式传递时,在函数体内是不可以修改该函数参数的值的,我们可以使用mutable修饰符,使得该函数参数可以在函数体内改变,下面我们实验一下
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修饰的函数参数,该函数参数可以在函数体内改变,也就是说不会改变函数体外该变量的值,我们也可以理解为在函数体内拷贝了这个变量的同名变量。

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

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

2.5 函数体

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/994691.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号