?++将lambda包装在函数内的另一个lambda中

Ale*_*ran 1 c++ lambda functional-programming c++11

基本上,我有以下代码:

struct Receiver {
    void receive(std::function<void()> f) {
        func_ = f;
    }
    std::function<void()> func_;
};

void pusher(Receiver& r) {
    auto wrapper=[&](std::function<void()> w) {
        r.receive([&]() {
            cout << "Before" << endl;   
            w();
            cout << "After" << endl;    
        });
    };


    wrapper([&]() {
        cout << "Original" << endl; 
    });
}

int main() {
    Receiver r;
    pusher(r);
    r.func_();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

有一个存储std :: function的类,我们将一个函数存储到该类中。函数是在另一个函数的“包装”本地lambda中创建的。

该代码打印“之前”并崩溃。如果我将整个代码放在“ pusher”中,放入main(),那么一切正常。

我怀疑我们遇到的问题是,当调用r.receive()时,它包含对“ w”的引用,该引用从“推送器”返回后是无效的。

但是我需要将一个lambda传递给接收器,该接收器是通过与另一个lambda进行“装饰”而创建的。

我如何正确地(通常)以引用一些本地lambda的方式装饰lambda并将其传递到其他地方?

0x4*_*2D2 5

按引用捕获[&]会导致lambda w在过期后保留对它的引用。您需要将其复制w [=]或移动到lambda(C ++ 14)中:

r.receive([w=std::move(w)]() {
    cout << "Before" << endl;   
    w();
    cout << "After" << endl;    
});
Run Code Online (Sandbox Code Playgroud)