问题遇到的现象和发生背景
C++中lambda表达式的值传递和引用传递到底有什么区别?
初学C++的时候,学到函数形参可以通过值传递和引用传递这两种方式。如果函数实现中让形参参与了运算,那么如果通过值传递,形参没有发生改变,如果用引用传递,则形参发生改变,此为背景。
然后我在用lambda表达式的时候发现一个神奇的现象,就是如果在类中用ambda表达式,无论值传递和引用传递,都可以改变形参的值。我贴一下代码,
问题相关代码,请勿粘贴截图
class A { //声明类A
public:
int a = 10; //声明变量a
void B1(int a) { //声明一个值传递的普通函数
a += 5;
}
void B2() { //声明一个函数,用lambda表达式值传递来实现
[=]() {a += 5; }();
}
};
void main() { //测试
A a1; //分别创建两个对象
A a2;
a1.B1(a1.a); //a1调用B1()后,打印a1.a
cout << "a1中的a=" << a1.a << endl;
a2.B2(); //a2调用B2()后,打印a2.a
cout << "a2中的a=" << a2.a << endl;
运行结果及报错内容
可以看到,a1调用B1()后,a=10,没有改变,符合值传递不改变形参值的结论;但是a2调用B2()后,a=15,说明发生了改变,我lambda表达式中无论用‘=’还是‘&‘都不影响结果。
然后继续探究,发现一个更有意思的事情:
就是如果我的lamda不写在类中,直接先在main函数中,则必须用"=";否则报错1.
如果改写&则不报错,并且结果是15:
然后如果声明变量改写为static,lambda用值传递则不报错,并且结果是15:
然后如果变量不写static,lambda表达式用mutable,则不报错,但结果是10:
我的解答思路和尝试过的方法
我想要达到的结果
所以我想问一下,为什么会这样。通过写在main函数中的lambda表达式可以知道,lambda其实是区别值传递和引用传递的,值传递确实不改形参,但是如果写在类里,效果等同于引用传递!这是为啥?