Qt 连接:使用 Lambda 表达式重置传递的 int 变量(奇怪)

Posted

技术标签:

【中文标题】Qt 连接:使用 Lambda 表达式重置传递的 int 变量(奇怪)【英文标题】:Qt Connections: Using Lambda Expression Resets Passed int Variable (Weird) 【发布时间】:2019-07-31 16:30:08 【问题描述】:

考虑以下代码:

int counter = 0;

QTimer* timer = new QTimer(this);

connect(timer, &QTimer::timeout, [this, &counter]() mutable 
    counter++;
    qDebug() << counter;
);

timer->start(500);

预期:

1
2
3
4
...

输出:

32766 (a random number)
...

这里有一些未定义的东西吗?我找不到有关此效果的任何信息。

【问题讨论】:

捕获对局部变量的引用。一旦该局部变量死亡(因为您离开了定义它的范围),您就会有一个悬空引用。 这就是解决方案!在将“counter”变成类成员变量后,它就永远不会死,也不会再有悬空引用。谢谢! 【参考方案1】:

[] 中的&amp;counter 表示您正在 lambda 中通过引用捕获counter

如果变量int counter 已经超出范围(因为局部变量不会这样做),那么这意味着您有一个悬空引用;使用它是未定义的行为。

解决此问题的简单方法是按值捕获计数器 -- [this, counter] 而不是 [this, &amp;counter]。然后 lambda 将拥有自己的 counter 状态副本。由于它是可变的,因此它有权编辑自己的状态。

【讨论】:

以上是关于Qt 连接:使用 Lambda 表达式重置传递的 int 变量(奇怪)的主要内容,如果未能解决你的问题,请参考以下文章

使用 lambda 表达式连接 pyqt 中的插槽

AWS Lambda 中的 PyMySql - 对等点重置连接

Qt5中的lambda表达式和使用lambda来写connect

Qt Lambda表达式的运用

Qt - 使用 lambda 函数修改先前连接信号的插槽参数

Qt5:与 lambda 的一次性连接