Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从lambda中的容器中取出self_C++_C++11_Lambda - Fatal编程技术网

C++ 从lambda中的容器中取出self

C++ 从lambda中的容器中取出self,c++,c++11,lambda,C++,C++11,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::unordere

我想注册一个回调,该回调可能会从其容器中移除自身。但我发现捕获的变量似乎被清除了。代码如下所示:

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;
}
A类{
int val_;
公众:
A(int val):val(val{}
void foo(){

std::cout您的代码具有未定义的行为,因为您是在从容器中删除闭包后访问闭包的。您应该在使用闭包后从容器中删除它:

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] () {
        for (int i = 0; i < 10; i++) {
            a.foo();
        }
        container.erase(func_index);
    }));
    container[func_index]();
    return 0;
}
A类{
int val_;
公众:
A(int val):val(val{}
void foo(){

std::您可能需要在这里添加更多的细节,说明什么实际上没有按照您的预期工作。您所说的“我发现捕获的变量似乎已被清理”是什么意思?谢谢!但是我必须在lambda的开头放上
erase
。有没有办法禁用容器中的这个函数的索引,直到我可以在lambda的末尾删除它为止?@user2134183:在调用
erase
之前,您可以将相关数据保存到局部变量中。重要的是不要访问删除闭包后捕获的变量。谢谢!我找到了另一种修复方法!我将容器中的
std::function
对象移动到lambda中,并从容器中移除空对象。只需在lambda的开头添加
std::function self=std::move(容器[func_index]);
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] () {
        for (int i = 0; i < 10; i++) {
            a.foo();
        }
        container.erase(func_index);
    }));
    container[func_index]();
    return 0;
}