C++ lambda const 值引用在线程中被删除

C++ lambda const value reference got deleted in thread

我遇到过以下情况:

void Plugin::sendMessage(const QString& jid, const QString &message) {
    qDebug() << "SENDING TO JID1: " << jid;
    QtConcurrent::run([&, this]() {
        qDebug() << "SENDING TO JID2: " << jid;
    }
}

产生下一个输出:

SENDING TO JID1: "test@xmpp.org"

SENDING TO JID2: "

然后它崩溃了。看起来 jid 不再存在于 lambda 中,但为什么呢?那么如何在这段代码中通过引用使用变量呢?

如果您来自 Java 背景,请注意 C++ 中的引用和 Java 中的引用含义非常不同。在 Java 中,引用被垃圾收集,因此很容易根据需要延长它们的生命周期。在 C++ 中没有垃圾收集,引用变量的生命周期与引用对象的生命周期几乎没有关系。

另请参阅 C++ References and Java References or Programmers Why do C++ and Java both use the notion of “reference” but not in the same sense? 了解更多说明。