C++新特性11_匿名函数中的mutable(当需要匿名函数从外部捕获参数并在函数内部进行修改时,这个时候就可以使用mutable关键字;捕获的参数在匿名函数内部都是有一份独一无二的拷贝值)

本篇接上篇,介绍lambda表达式中的mutable
mutable
使用情形:个人理解当你需要匿名函数从外部捕获参数并在函数内部进行修改时,这个时候就可以使用mutable关键字。

之前我们在类中的常成员函数中的变量是不可以修改的,但是一旦定义为mutable就可以修改。

1.lambda表达式未增加mutable不可以修改参数

int main() {
	int t = 10;
	auto f = [t]() {
		return ++t;
	};
}

在这里插入图片描述

2. 增加mutable之后代表参数是可以修改的


#include <iostream>
using namespace std;


int main() {
	int t = 10;
	//按值捕获,内部修改不会改变t的值
	auto f = [t]() mutable{
		return ++t;
	};
	cout << f() << endl;
	cout << f() << endl;
	cout << t << endl;
}

在这里插入图片描述

3. 两个问题

3.1 为什么main函数中t的值没有修改?

这是因为按值捕获,内部修改不会改变t的值。

3.2 那为什么匿名函数内部的t会发生改变呢?

运行程序可以得到如下结果:

  • main函数中t的地址:
    在这里插入图片描述
  • 匿名函数中t的地址:
    在这里插入图片描述
    main函数和匿名函数中t的地址是不同的,大家应该也看出来了。

原因:在匿名函数中的t是从main函数中拷贝出来的,在匿名函数作用域中是独一无二的,也是与main中的不是一个t。

4. 相同名称参数在不同匿名函数中的值

下面程序赋值之前的匿名函数,都调用t。


#include <iostream>
using namespace std;


int main() {
	int t = 10;
	//按值捕获,内部修改不会改变t的值
	auto f = [t]() mutable{
		return ++t;
	};

	auto f2 = [t]() mutable {
		return ++t;
	};

	cout << f() << endl;
	cout << f2() << endl;
	cout << f() << endl;
	cout << f2() << endl;
	cout << t << endl;
}

运行之后可以看到:在不同的匿名函数中会拷贝一份专属于当前作用域的变量,而不会相互干扰。

5.学习视频地址:匿名函数mutable

6.学习笔记:匿名函数mutable笔记

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十月旧城

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值