首页 > 解决方案 > std::optional 不可复制?

问题描述

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

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

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

标签: c++c++17noncopyablestdoptional

解决方案


问题是它std::scoped_lock本身既不能移动也不能复制。所以成员函数的返回值不能被复制/移动到你发布的函数的返回值中。修复很简单。使用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它将无法编译。


推荐阅读