我想註冊一個可能從其容器中移除的回調。但我發現捕獲的變量似乎被清理了。這樣的代碼:從lambda中的容器中刪除自己
class A {
int val_;
public:
A(int val) : val_(val) {}
void foo() {
std::cout << val_ << std::endl;
}
};
int main()
{
const int func_index = 1;
std::unordered_map<int, std::function<void(void)>> container;
A a(10);
container.insert(std::make_pair(func_index, [&container, func_index, &a]() {
container.erase(func_index);
for (int i = 0; i < 10; i++) {
a.foo();
}
}));
container[func_index]();
return 0;
}
的解決方案,移動的std ::函數對象到拉姆達推遲其銷燬:
class A {
int val_;
public:
A(int val) : val_(val) {}
void foo() {
std::cout << val_ << std::endl;
}
};
int main()
{
const int func_index = 1;
std::unordered_map<int, std::function<void(void)>> container;
A a(10);
container.insert(std::make_pair(func_index, [&container, func_index, &a]() {
std::function<void(void)> self = std::move(container[func_index]);
container.erase(func_index);
for (int i = 0; i < 10; i++) {
a.foo();
}
}));
container[func_index]();
return 0;
}
你可能需要在這裏添加什麼像您期望實際上是不工作的一些更詳細。 – crowder
你是什麼意思「我發現捕獲的變量似乎被清理」? –