1.当lambda表达式中使用[=](){}时,为按值拷贝作用范围的局部变量,默认不可修改按值传进来的拷贝。
如图:不加mutable时报错,a不可改变
加mutable后可以改变a值,但是时修改的拷贝对象,connect上边的a值未修改。
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
int a = 10;
connect(ui->pushButton,&QPushButton::clicked,[=]()mutable{
a += 2;
qDebug() << "按钮1下的a:" << a;
});
connect(ui->pushButton_2,&QPushButton::clicked,[=]()mutable{
qDebug() << "按钮2下的a:" << a;
});
}
如下图,为验证结果:
2.至于[&](){}是按引用传递,不过如果使用这个来传递会出现如下情况:
这是因为构造函数执行完之后,局部变量a被释放了。a的地址被记录在槽函数中,但是值被改变了。
我之前一直傻傻的认为mainwindow的构造是在关闭ui后才结束,因为我认为程序都被包裹在里边了。看来我错了。。。