С ++ обёртывание лямбды в другую лямбду внутри функции - PullRequest
1 голос
/ 20 июня 2019

По сути, у меня такой код:

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;
}

Есть класс, который хранит std :: function, и мы сохраняем функцию в этом классе.Функция создается в «обертке» локальной лямбды другой функции.

Код печатает «До» и вылетает.Если я помещаю весь код внутри «pusher» в main (), то все работает.

Я подозреваю, что проблема в том, что когда вызывается r.receive (), он содержит ссылку на «w», что недопустимопосле возвращения из "толкателя".

Но мне нужно передать лямбду получателю, который создается путем "украшения" другой лямбдой.

Как правильно (в общем) украситьлямбда со ссылкой на какую-то местную лямбду и передать ее куда-нибудь еще?

1 Ответ

5 голосов
/ 20 июня 2019

Захват по ссылке [&] заставляет лямбду хранить ссылку на w после ее истечения.Вам либо нужно скопировать w [=] или переместить его в лямбду (C ++ 14):

r.receive([w=std::move(w)]() {
    cout << "Before" << endl;   
    w();
    cout << "After" << endl;    
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...