Передача уникального ptr в метод asyn c - PullRequest
0 голосов
/ 14 апреля 2020

Я пытаюсь вызвать reset() для вектора unique_ptr с асинхронно:

std::vector<std::unique_ptr<SomeClass>> myVector;
for (auto& keyVal : myVector) {
  future<void> f = async(launch::async, [=]() {
    keyVal.second.reset();
  });
  listOfFutures.push_back();
}

Это не работает по двум причинам:

  • Функция reset() unique_ptr не помечена const, но unique_ptr при копировании по умолчанию получает const.

  • Если я отмечу функцию async как mutable, компилятор говорит мне, что я вызываю неявно удаленный конструктор копирования, который я не понимаю.

1 Ответ

1 голос
/ 14 апреля 2020

Я думаю, это делает то, что вы хотите.

for (auto& keyVal : myMap) {
    future<void> f = async(launch::async, [&ptr = keyVal.second] () mutable {
      ptr.reset();
    });
    listOfFutures.push_back();
}

Однако это плохая идея, поскольку данные, на которые указывает unique_ptr, могут быть удалены в любое время. Таким образом, вы должны просто использовать свою версию с std :: move.

EDIT: заявлено, что это плохая идея, как указано в комментариях

...