C++:Lambda表达式

在C++ 11 中,Lambda表达式用于定义并创建匿名的函数对象,以简化编程工作。
为什么可以简化编程工作呢,我们以QT中的connect为例。

我们可以用Lambda表达式直接作为参数 而不用再另去定义槽函数,为编程工作提供了方便。

构成

[ ] ( ) mutable-> return type{ }

当看到这东西的时候你是不是一脸懵逼,不要急,我们一点一点来看。

函数对象参数

写于[ ] 中的参数
Lambda表达式 不能访问封闭函数中的局部变量,所以我们通过这个参数让Lambda表达式可以访问所在函数的局部变量。

我们可以填入这些参数

参数作用
不填入任何参数,即无法访问外部局部变量 但注意 即使不填入参数 中括号也不能省去
=值传递的方式使用当前作用域内所有局部变量(包括当前对象的this)
&引用的方式使用当前作用域内所有局部变量(包括当前对象的this)
变量a只能使用变量a,以值传递的方式传入,函数不能修改这个变量a的拷贝
&变量a只能使用变量a,以引用的方式传入
&变量a , 变量ba引用传递,b值传递 ,且只能使用这两个局部变量
& , 变量a只有a值传递 其他所有为引用传递
= , 变量a只有a引用传递,其他为值传递

据Visual Studio 编译器 所有写在[ ]的变量 都位于捕获列表中 只有位于捕获列表的局部变量才能被使用。

void test01()
{
	int m = 3;
	[] () {
		cout << m;
	}();
}

变量m并没有在捕获列表中 此时编译器会报错。

void test01()
{
	int m = 3;
	[m] () {
		cout << m;
	}();
}
void test01()
{
	int m = 3;
	[=] () {
		cout << m;
	}();
}
void test01()
{
	int m = 3;
	[&] () {
		cout << m;
	}();
}

我们只需要让m位于捕获列表中 编译器就不能报错了


如果我们将函数改为这样

void test01()
{
	int m = 3;
	[m] () {
		m = 5;
	}();
}

编译器是会报错的,为什么呢 因为以值传入的变量 是会自动加上const限定的 我们不可以修改这个值 如果想要修改必须加上关键字mutable
这个关键字我们在常函数的地方见过。

void test01()
{
	int m = 3;
	[m] () mutable {
		m = 5;
	}();
}

但是这样 我们在Lambda 函数外面再输出一遍m 结果是多少呢。

是 3

因为变量是以值传入的,如果你想改变变量本身 可以选择引用传递。

函数参数

和普通函数一样,第二个小括号可以在调用时传入参数

可修改标识符

关键字mutable
加上此关键字后可以修改值传递进来的拷贝 但不是值本身。

返回值类型

在Lambda表达式中 可以声明函数的返回值类型
[ ] ( ) -> return type { }

int ret = [] () -> int
{
	return 3 + 5;
}

但有时候-> return type 可以省略
比如

  1. 什么都不写 返回值就是void
  2. 或者 整个函数体只有一处 return , 编译器可以识别返回类型

函数体

和普通函数一样

注意

[] () {} 只是函数的定义与声明
调用需要在后面加()

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值