c++ - 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
。
解决这个难题的最佳方法是什么?
解决方案
问题是它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
它将无法编译。
推荐阅读
- mysql - mysql:无法修改或更新日期值 0000-00-00 的列
- android - Ionic 3 如何知道 GPS 是否启用
- android - 首次运行应用程序时出错无法投射问题
- sql - 仅使用 Where 语句获取唯一条目?
- reactjs - 我将如何在自定义域上部署我的 React.js 更改?
- mysql - mysql 我可以按两个日期中最早的日期排序吗?
- java - SVG 文本上的清晰文本
- python - 从一个非常大的生成器中选择一个随机样本
- node.js - 如何显示节点 chid_process 命令的进度?
- javascript - 在更高级别表单的组件之间传递表单字段时遇到问题