Я хочу иметь возможность совместно использовать переменную в области содержимого между двумя лямбда-функциями. У меня есть следующие:Поделиться переменной между двумя lambdas
void holdAdd(const Rect& rectangle, Hold anonymousHeld, Hold anonymousFinish) {
std::map<int,bool> identifierCollection;
HoldFinish holdFinish = [=](const int& identifier) mutable {
if (identifierCollection.count(identifier) == 0) return;
identifierCollection.erase(identifier);
anonymousFinish();
};
holdCollisionCollection.push_back([=](const int& identifier, const Vec2& point) mutable {
if (rectangle.containsPoint(point)) {
identifierCollection[identifier] = true;
anonymousHeld();
} else {
holdFinish(identifier);
}
});
holdFinishCollection.push_back(holdFinish);
}
Я могу видеть в отладчике, что holdFinish
наведен на другую реализацию identifierCollection
, чем во 2-й лямбда-функции.
Если я использую [=, &identifierCollection]
, он выбрасывает EXC_BAD_ACCESS
, пользуюсь ли я mutable
или нет.
Опыт работы с другими языками, реализующими встроенные функции, заключается в том, что это должно быть возможно. Например, в JavaScript:
var a = 10;
var b = function() {
a += 2;
}
var c = function() {
a += 3;
}
b();
c();
alert(a);
предупредит ли 15
.
Что мне нужно сделать, чтобы обе лямбда-функции ссылались на один и тот же идентификатор реализации набора? Таким образом, он ведет себя так же, как пример javascript.
Таким образом, проблема заключается в том, что при захвате по значению, которое вы захватили по значению, и когда вы захватываете по ссылке, вы захватили оборванную ссылку на локальную переменную ... Вам нужно будет решить что вы хотите, чтобы жизнь объекта была. –
делает '[&]' работа? попробуйте сделать карту 'static' – twentylemon
Оберните карту в' shared_ptr'. –