C++:无法在 lambda 中捕获 "this" 上下文 2 次

C++: Cannot capture "this" context 2 times in lambdas

下面是重现问题的最小代码:

std::vector<std::function<bool()>> injections;
struct Obj {
    void load() {
        injections.push_back([&] {
            std::cout << ++counter << std::endl;
            injections.push_back([&] {
                std::cout << ++counter << std::endl;
                return true;
            });
            // std::cout << ++counter << std::endl;
            return true;
        });
    }
    int counter = 0;
};
int main() {
    Obj obj;
    obj.load();
    while(true)
        for(auto i = 0; i < injections.size(); i++) {
            auto pop = injections[i]();
            if(pop)
                injections.erase(injections.begin() + i--);
        }
}

运行 正是这样,一切正常,但取消注释注释行,它崩溃了。问题是在推送第二个 lambda 之后,this 指向一些垃圾,然后 ++counter 抛出。我希望第一个 lambda 通过引用捕获成员,这些成员在结束 load() 后不会超出范围,这正是发生的情况。对于第二个 lambda,我希望通过引用捕获引用,使 counter 可用,这又是使用注释错误行时发生的情况。看起来 lambda 的构造使其之后的所有内容都无效。这是什么原因和一些解决方案?

当您在 injections 中插入内容时,之前的 std::function<bool()> 可能会被移动(并被破坏)。

因此 injections.push_back 之后的代码不应再使用 captures/members。

主要相当于usage of delete this;一个方法中的