я столкнулся со следующей ситуацией:C++ лямбда эталонное значение сопз были удалены в потоке
void Plugin::sendMessage(const QString& jid, const QString &message) {
qDebug() << "SENDING TO JID1: " << jid;
QtConcurrent::run([&, this]() {
qDebug() << "SENDING TO JID2: " << jid;
}
}
производит следующий вывод:
ОТПРАВКА В JID1: "[email protected]"
ОТПРАВКА НА JID2: «
, а затем он падает. Он выглядит как jid
больше не существует в лямбда, но почему? Как тогда я могу использовать переменные по ссылкам в этом коде?
Проблема, скорее всего, в том, что вы не можете контролировать, когда выполняется функция лямбда в 'QConcurrent', и это может означать, что строка, на которую ссылается' jid', была разрушена. Вместо этого сделайте снимок. –
Да, это работает, если я фиксирую по значению, просто задаюсь вопросом, почему компилятор не может продлить существование ссылки до выполнения лямбда. –
Поскольку компилятор понятия не имеет, что происходит, или когда (если когда-либо), эта ссылка понадобится. –