Проблема в том, что 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
, не сможет скомпилироваться.