c++ - Qt连接: Using Lambda Expression Resets Passed int Variable (Weird)

标签 c++ qt c++11 qt5

考虑以下代码:

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 表示您正在 lambda 中通过引用捕获 counter

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

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

关于c++ - Qt连接: Using Lambda Expression Resets Passed int Variable (Weird),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57295332/

相关文章:

c++ - 转到 Vim 中 C++ 函数的末尾

c++ - 在 Windows 上获取 boost::filesystem::path 作为 UTF-8 编码的 std::string

c++ - 使用 Make 包含一个 .cpp 文件

c++ - 使用 AES 256 (MS CryptoAPI) 时 CryptDecrypt 出现错误数据错误

qt - 在 QML ScrollView 中增加鼠标滚轮步骤

c++ - 多集 STL 中的下界

linux - 以 QT 方式使用 linux 套接字?

qt - 包含来自单独目录的文件时的 undefined reference

c++ - DMA 的同步要求

c++ - 警告 : defaulted move assignment operator of X will move assign virtual base class Y multiple times