我有一个不可复制但可移动的资源包装类。像这样的东西(伪代码)
class Wrapper {
SomeResource* m_handle = nullptr;
public:
Wrapper(const Wrapper&) = delete;
Wrapper& operator=(const Wrapper&) = delete;
Wrapper(SomeResource* handle) : m_handle(handle) { }
Wrapper(Wrapper&& other) {
std::swap(m_handle, other.m_handle);
}
}
这一切都很好,但是我有很多这样的,我有一个函数可以解析一些数据并返回一个包装器或一个替代包装器。我想用std::variant
返回值来表达这一点。例如
std::variant<Wrapper, AlternativeWrapper> LoadData(void* bytes, size_t len)
{ ... }
我可以编写这个函数,它全部编译。即我在 LoadData 函数中构造了一个 Wrapper,然后我可以将它移动到然后返回的变体中。
但另一方面,当我想取出值时,得到这个错误(MSVC2019)
error C2280: 'Wrapper::Wrapper(const Wrapper&)': attempting to reference a deleted function
我的代码看起来像这样。
auto result = LoadData(bytes, len);
std::get<Wrapper>(result);
这是有道理的,因为结果仍然存在,但是我该如何访问它呢?