std::optional服用不可复制?

std::optional taking non-copyable?

假设我有类似于此的东西伪代码:

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> >
}

这行不通,基本上如果尝试使用真实代码会给出关于 return type cannot be converted to std::optional.

的错误

解决这个难题的最佳方法是什么?

问题是std::scoped_lock本身既不可移动也不可复制。所以成员函数的 return 值不能 copied/moved 到你发布的函数的 return 值。修复很简单。使用可移动的 std::unique_lock。下面是在 gcc

上为我编译的测试代码
#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编译会失败。