@@ -69,6 +69,12 @@ namespace std {
6969
7070 // 20.7.2.6, swap
7171 void swap(variant&) noexcept(see below);
72+
73+ // [variant.visit], visitation
74+ template<class Self, class Visitor>
75+ constexpr decltype(auto) visit(this Self&&, Visitor&&); // Since C++26
76+ template<class R, class Self, class Visitor>
77+ constexpr R visit(this Self&&, Visitor&&); // Since C++26
7278 };
7379
7480 // 20.7.3, variant helper classes
@@ -235,6 +241,7 @@ namespace std {
235241#include < __type_traits/void_t.h>
236242#include < __utility/declval.h>
237243#include < __utility/forward.h>
244+ #include < __utility/forward_like.h>
238245#include < __utility/in_place.h>
239246#include < __utility/move.h>
240247#include < __utility/swap.h>
@@ -1130,6 +1137,19 @@ using __best_match_t = typename invoke_result_t<_MakeOverloads<_Types...>, _Tp,
11301137
11311138} // namespace __variant_detail
11321139
1140+ template <class _Visitor , class ... _Vs, typename = void_t <decltype (std::__as_variant(std::declval<_Vs>()))...>>
1141+ _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS constexpr decltype (auto )
1142+ visit(_Visitor&& __visitor, _Vs&&... __vs);
1143+
1144+ # if _LIBCPP_STD_VER >= 20
1145+ template <class _Rp ,
1146+ class _Visitor ,
1147+ class ... _Vs,
1148+ typename = void_t <decltype (std::__as_variant(std::declval<_Vs>()))...>>
1149+ _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS constexpr _Rp
1150+ visit (_Visitor&& __visitor, _Vs&&... __vs);
1151+ # endif
1152+
11331153template <class ... _Types>
11341154class _LIBCPP_TEMPLATE_VIS _LIBCPP_DECLSPEC_EMPTY_BASES variant
11351155 : private __sfinae_ctor_base< __all<is_copy_constructible_v<_Types>...>::value,
@@ -1273,6 +1293,27 @@ public:
12731293 __impl_.__swap (__that.__impl_ );
12741294 }
12751295
1296+ # if _LIBCPP_STD_VER >= 26 && defined(_LIBCPP_HAS_EXPLICIT_THIS_PARAMETER)
1297+ // Helper class to implement [variant.visit]/10
1298+ // Constraints: The call to visit does not use an explicit template-argument-list
1299+ // that begins with a type template-argument.
1300+ struct __variant_visit_barrier_tag {
1301+ _LIBCPP_HIDE_FROM_ABI explicit __variant_visit_barrier_tag () = default;
1302+ };
1303+
1304+ template <__variant_visit_barrier_tag = __variant_visit_barrier_tag{}, class _Self , class _Visitor >
1305+ _LIBCPP_HIDE_FROM_ABI constexpr decltype (auto ) visit(this _Self&& __self, _Visitor&& __visitor) {
1306+ using _VariantT = _OverrideRef<_Self&&, _CopyConst<remove_reference_t <_Self>, variant>>;
1307+ return std::visit (std::forward<_Visitor>(__visitor), (_VariantT)__self);
1308+ }
1309+
1310+ template <class _Rp , class _Self , class _Visitor >
1311+ _LIBCPP_HIDE_FROM_ABI constexpr _Rp visit (this _Self&& __self, _Visitor&& __visitor) {
1312+ using _VariantT = _OverrideRef<_Self&&, _CopyConst<remove_reference_t <_Self>, variant>>;
1313+ return std::visit<_Rp>(std::forward<_Visitor>(__visitor), (_VariantT)__self);
1314+ }
1315+ # endif
1316+
12761317private:
12771318 __variant_detail::__impl<_Types...> __impl_;
12781319
@@ -1511,7 +1552,7 @@ _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS constexpr vo
15111552 }
15121553}
15131554
1514- template < class _Visitor , class ... _Vs, typename = void_t < decltype (std::__as_variant(std::declval<_Vs>()))...> >
1555+ template < class _Visitor , class ... _Vs, typename >
15151556_LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS constexpr decltype (auto )
15161557visit(_Visitor&& __visitor, _Vs&&... __vs) {
15171558 using __variant_detail::__visitation::__variant;
@@ -1520,10 +1561,7 @@ visit(_Visitor&& __visitor, _Vs&&... __vs) {
15201561}
15211562
15221563# if _LIBCPP_STD_VER >= 20
1523- template < class _Rp ,
1524- class _Visitor ,
1525- class ... _Vs,
1526- typename = void_t <decltype (std::__as_variant(std::declval<_Vs>()))...> >
1564+ template < class _Rp , class _Visitor , class ... _Vs, typename >
15271565_LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS constexpr _Rp
15281566visit (_Visitor&& __visitor, _Vs&&... __vs) {
15291567 using __variant_detail::__visitation::__variant;
0 commit comments