QT连接:使用lambda表达式重置通过了int变量(怪异)

Qt Connections: Using Lambda Expression Resets Passed int Variable (Weird)

本文关键字:int 通过了 变量 怪异 连接 使用 lambda 表达式 QT      更新时间:2023-10-16

考虑以下代码:

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中的 CC_1表示您正在捕获lambda中的 counter副词。

如果变量int counter已经超出了范围(因为局部变量是不会执行的(,则这意味着您有一个悬空的参考;使用它是未定义的行为。

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