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
编译会失败。
假设我有类似于此的东西伪代码:
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
编译会失败。