std :: необязательный, не копируемый? - PullRequest
0 голосов
/ 28 февраля 2020

Предположим, у меня есть что-то похожее на этот псевдокод :

std::optional<std::pair<double*, std::scope_lock<std::mutex> > > getDataTogetherWithLock() {
  if (!some_ptr) {
    return std::nullopt;
  }
  return some_ptr->getDataTogetherWithLock();//just returns std::pair<double*, std::scope_lock<std::mutex> >
}

Это не будет работать, в основном, если попытка с реальным кодом даст ошибку о типе возвращаемого значения, не может быть преобразовано на std::optional.

Как лучше всего решить эту головоломку?

1 Ответ

1 голос
/ 28 февраля 2020

Проблема в том, что std::scoped_lock сам по себе не является ни подвижным, ни копируемым. Поэтому возвращаемое значение функции-члена не может быть скопировано / перемещено в возвращаемое значение функции, которую вы опубликовали. Исправить это просто. Используйте std::unique_lock, который является подвижным. Следующий тестовый код, скомпилированный для меня на g cc

#include <optional>
#include <mutex>

struct A {
    std::pair<double*, std::unique_lock<std::mutex> > getDataTogetherWithLock();
} *some_ptr;

std::optional<std::pair<double*, std::unique_lock<std::mutex> > > getDataTogetherWithLock() {
  if (!some_ptr) {
    return std::nullopt;
  }
  return some_ptr->getDataTogetherWithLock();
}

с std::scoped_lock, не сможет скомпилироваться.

...