问题:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13mypushbta::mypushbta(QWidget *parent) : QMainWindow(parent), ui(new Ui::mypushbta) { int m=15; (QPushButton类型 btw 初始化省略) qDebug()<<m; connect(btw1,&QPushButton::clicked,this,[m]()mutable{m=110;qDebug()<<m;}); connect(btw2,&QPushButton::clicked,this,[&m](){m=120;qDebug()<<m;}); connect(btw3,&QPushButton::clicked,this,[&m](){qDebug()<<m;}); }
学习QT中的lambda表达式时遇到了问题:
对局部变量进行 按引用传递 时,初始值 和 原变量值不同,是一个垃圾数。
且赋值后不会改变原变量值。
简单来说:引用传递的 变量 和 原变量 已经不是同一个变量了(虽然变量名相同)
————————————————————
思路:
我们借用地址看一下构造情况。
从案例中可以看出
按引用传递地址是传过去了,可值却变成了垃圾数。
按值传递 值和原变量一样,但开辟了一个新地址。
这里需要提到的知识点:
lambda表达式中,
①按值传递是参数为原变量的拷贝构造函数,不会影响原变量的值。但拷贝构造默认参数是const只读类型,修改时需要用mutable关键字强调。
②按引用传递可以看作传递原变量的地址。但局部函数的生命周期非常短。
可以看作:我们用传入的地址作为新的地址初始化,将原来的地址内容以NULL覆盖了。
————————————————
解决:
①把label这个变量做成成员变量,不要用局部变量了。
②引用传递的同时,把原值赋给地址。
最后
以上就是无语荔枝最近收集整理的关于[QT]lambda 引用传递的小问题的全部内容,更多相关[QT]lambda内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复