Questions tagged «variant»


2
GCC9是否避免了std :: variant的无值状态?
我最近关注了Reddit的讨论,该讨论使std::visit编译器之间的优化有了很好的比较。我注意到以下内容:https : //godbolt.org/z/D2Q5ED 当所有类型都满足某些条件时,GCC9和Clang9(我猜它们共享相同的stdlib)都不会生成用于检查并抛出无值异常的代码。这导致更好的代码生成方式,因此我提出了MSVC STL的问题,并向其提供了以下代码: template <class T> struct valueless_hack { struct tag {}; operator T() const { throw tag{}; } }; template<class First, class... Rest> void make_valueless(std::variant<First, Rest...>& v) { try { v.emplace<0>(valueless_hack<First>()); } catch(typename valueless_hack<First>::tag const&) {} } 声称是,这使得任何变体都没有价值,并且阅读文档应该: 首先,销毁当前包含的值(如果有)。然后直接初始化包含的值,就像T_I使用参数构造类型的值一样。如果std::forward<Args>(args)....引发异常,则*this可能变为valueless_by_exception。 我不明白的是:为什么将其表示为“可能”?如果整个操作失败,保持旧状态合法吗?因为这是GCC的工作: // For suitably-small, trivially copyable types we …

5
为什么不能检索变体的索引并使用它来获取其内容?
我正在尝试访问变体的内容。我不知道里面有什么,但值得庆幸的是,变体确实可以。所以我想我只想问问变体它在什么索引上,然后将该索引用于std::get它的内容。 但这不能编译: #include <variant> int main() { std::variant<int, float, char> var { 42.0F }; const std::size_t idx = var.index(); auto res = std::get<idx>(var); return 0; } 错误发生在std::get呼叫中: error: no matching function for call to ‘get<idx>(std::variant<int, float, char>&)’ auto res = std::get<idx>(var); ^ In file included from /usr/include/c++/8/variant:37, from main.cpp:1: /usr/include/c++/8/utility:216:5: …
10 c++  c++17  variant 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.