C++ 在C++;,我可以从std::variant中移出一些内容吗?
我有一个不可复制但可移动的资源包装器类。类似这样的东西(伪代码) 这一切都很好,但是我有很多这样的函数,我有一个函数,它解析一些数据并返回一个包装器或另一个包装器。我想用C++ 在C++;,我可以从std::variant中移出一些内容吗?,c++,stl,std-variant,C++,Stl,Std Variant,我有一个不可复制但可移动的资源包装器类。类似这样的东西(伪代码) 这一切都很好,但是我有很多这样的函数,我有一个函数,它解析一些数据并返回一个包装器或另一个包装器。我想用std::variant来表示返回值。例如 std::variant<Wrapper, AlternativeWrapper> LoadData(void* bytes, size_t len) { ... } 我的代码看起来像这样 auto result = LoadData(bytes, len); std::
std::variant
来表示返回值。例如
std::variant<Wrapper, AlternativeWrapper> LoadData(void* bytes, size_t len)
{ ... }
我的代码看起来像这样
auto result = LoadData(bytes, len);
std::get<Wrapper>(result);
auto result=LoadData(字节,len);
std::get(结果);
这是有道理的,因为结果仍然存在,但我如何访问它呢?哎呀,我在发布问题两分钟后就解决了这个问题 您可以
std::将变量移动到std::get
auto v = LoadData(bytes, len);
std::get<Wrapper>(std::move(v));
auto v=LoadData(字节,len);
std::get(std::move(v));
或者直接内联它,使变量成为临时右值
std::get<Wrapper>(LoadData(bytes, len));
std::get(LoadData(bytes,len));
[更新:]我原本说std::move破坏了原始变体,但正确地更正了它没有。。。然而,实际发生的情况是,变量内部的包装在移出时被破坏,这是意料之中的在显示的代码中没有复制。您是否正在使用std::get(result)的结果代码>进一步?“这会破坏原始变体”:它不会。它只是返回对元素的右值引用,而不是左值引用。它对变体没有任何作用。
auto v = LoadData(bytes, len);
std::get<Wrapper>(std::move(v));
std::get<Wrapper>(LoadData(bytes, len));