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 …