本篇接上篇,介绍lambda表达式中的mutable
mutable
使用情形:个人理解当你需要匿名函数从外部捕获参数并在函数内部进行修改时,这个时候就可以使用mutable关键字。
之前我们在类中的常成员函数中的变量是不可以修改的,但是一旦定义为mutable就可以修改。
C++新特性11_匿名函数中的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笔记