【发布时间】:2015-06-13 21:43:17
【问题描述】:
我希望能够在两个 lambda 函数之间共享包含范围内的变量。我有以下内容:
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 的实现与第二个 lambda 函数不同。
如果我使用[=, &identifierCollection],无论我是否使用mutable,它都会抛出EXC_BAD_ACCESS。
我对实现内联函数的其他语言的经验是,这应该是可能的。例如在 javascript 中:
var a = 10;
var b = function() {
a += 2;
}
var c = function() {
a += 3;
}
b();
c();
alert(a);
会提醒15。
我必须做什么才能让两个 lambda 函数引用相同的 identifierCollection 实现?这样它的行为方式与 javascript 示例相同。
【问题讨论】:
-
所以问题是,当您按值捕获时,您已经按值捕获,而当您按引用捕获时,您已经捕获了对局部变量的悬空引用......你会有来决定你希望对象的生命周期是什么。
-
[&]有效吗?尝试制作地图static -
将地图包裹在
shared_ptr中。 -
你需要自己管理C++对象的生命周期;或者如果您使用
shared_ptr,它将自动完成。 -
@richardjsimkins:没错。 C++ 和 JavaScript 几乎没有什么相似之处。
标签: c++ lambda anonymous-function capture