порядок инициализации лямбды в качестве параметра, который принимает другие параметры - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть параметр (в данном случае std :: vector), который мне нужно передать асинхронному методу (желательно с помощью move) и лямбда-функции обратного вызова. Гарантирует ли приведенный ниже подход, что лямбда будет инициализирована первой (подразумевается копирование вектора), чтобы я мог переместить вектор в асинхронный метод?

Method(std::vector<std::string> vec)
{
    AsyncMethod(std::move(vec), [vec]() 
    {
        // act on vec
    });
}

1 Ответ

0 голосов
/ 13 сентября 2018

Порядок вычисления параметра функции не определен, поэтому вы не можете полагаться на свое предположение.Решение может быть следующим:

Method(std::vector<std::string> vec)
{
    auto l = [vec]() { /* Act on vec... */ };

    AsyncMethod(std::move(vec), l);
}

В зависимости от подписи AsyncMethod, вы можете даже передать лямбду как std::move(l).Это снова будет безопасно, поскольку вектор был заранее скопирован в замыкание.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...