Правильный способ передачи уникального указателя на r-значение в лямбду - PullRequest
0 голосов
/ 07 апреля 2020

Я новичок в C ++ и работаю над существующей кодовой базой, и пытаюсь выяснить, как передать уникальный указатель r-значения ref в лямбду и правильно передать владение.

В настоящее время мы have:

void MyClass::onResponse(uniq_ptr<Foo>&& response) {
    parent_.doSomething(std::move(response));
}

Мне нужно изменить это, чтобы сделать некоторые вещи (в основном, таймер) в основном потоке, используя функцию postToMainThread, которая принимает лямбду, а затем вызывает doSomething, как раньше , Публикация в главном потоке с фиктивным ответом работает нормально, но когда я пытаюсь пропустить / переместить лямбду, я получаю segfault, поскольку что-то на другой стороне пытается получить ответ:

void MyClass::onResponse(uniq_ptr<Foo>&& response) {
    postToMainThread([this, &response]() {
        // Do some stuff that must be on main thread
        parent_.doSomething(std::response);
    }
}

Я видел несколько примеров, в которых используется postToMainThread([this, response = std::move(response)]() {..., но это не компилируется из-за конструктора копирования при ошибке уникального указателя. Я понимаю, что мне нужно передать право собственности на ответ, но я не знаю, как.

1 Ответ

0 голосов
/ 08 апреля 2020

Хорошо, разобрался. Я добавил свойство response_ в MyClass и переместил его в MyClass::onResponse(). Это, в свою очередь, запустило пост и таймер, который называется новый MyClass::XXX(). Это, в свою очередь, выполняется parent_.doSomething(std::move(response_)) с сохраненным ответом. Уф!

...