diff --git a/stl/inc/utility b/stl/inc/utility index 999de93c950..4570a7bb790 100644 --- a/stl/inc/utility +++ b/stl/inc/utility @@ -973,6 +973,46 @@ _NODISCARD _MSVC_INTRINSIC constexpr _Forward_like_t<_Ty, _Uty> forward_like(_Ut } #endif // _HAS_CXX23 +#if _HAS_CXX17 +_EXPORT_STD struct monostate {}; + +_EXPORT_STD _NODISCARD constexpr bool operator==(monostate, monostate) noexcept { + return true; +} + +#if _HAS_CXX20 +_EXPORT_STD _NODISCARD constexpr strong_ordering operator<=>(monostate, monostate) noexcept { + return strong_ordering::equal; +} +#else // ^^^ _HAS_CXX20 / !_HAS_CXX20 vvv +_NODISCARD constexpr bool operator!=(monostate, monostate) noexcept { + return false; +} +_NODISCARD constexpr bool operator<(monostate, monostate) noexcept { + return false; +} +_NODISCARD constexpr bool operator>(monostate, monostate) noexcept { + return false; +} +_NODISCARD constexpr bool operator<=(monostate, monostate) noexcept { + return true; +} +_NODISCARD constexpr bool operator>=(monostate, monostate) noexcept { + return true; +} +#endif // ^^^ !_HAS_CXX20 ^^^ + +template <> +struct hash { + using _ARGUMENT_TYPE_NAME _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS = monostate; + using _RESULT_TYPE_NAME _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS = size_t; + + _NODISCARD _STATIC_CALL_OPERATOR size_t operator()(monostate) _CONST_CALL_OPERATOR noexcept { + return 1729; // Arbitrary value + } +}; +#endif // _HAS_CXX17 + #if _HAS_TR1_NAMESPACE namespace _DEPRECATE_TR1_NAMESPACE tr1 { using _STD get; diff --git a/stl/inc/variant b/stl/inc/variant index e2a2e7581c6..c17d88fe17e 100644 --- a/stl/inc/variant +++ b/stl/inc/variant @@ -1647,32 +1647,6 @@ constexpr _Ret visit(_Callable&& _Obj, _Variants&&... _Args) { } #endif // _HAS_CXX20 -_EXPORT_STD _NODISCARD constexpr bool operator==(monostate, monostate) noexcept { - return true; -} - -#if _HAS_CXX20 -_EXPORT_STD _NODISCARD constexpr strong_ordering operator<=>(monostate, monostate) noexcept { - return strong_ordering::equal; -} -#else // ^^^ _HAS_CXX20 / !_HAS_CXX20 vvv -_NODISCARD constexpr bool operator!=(monostate, monostate) noexcept { - return false; -} -_NODISCARD constexpr bool operator<(monostate, monostate) noexcept { - return false; -} -_NODISCARD constexpr bool operator>(monostate, monostate) noexcept { - return false; -} -_NODISCARD constexpr bool operator<=(monostate, monostate) noexcept { - return true; -} -_NODISCARD constexpr bool operator>=(monostate, monostate) noexcept { - return true; -} -#endif // ^^^ !_HAS_CXX20 ^^^ - _EXPORT_STD template ..., is_swappable<_Types>...>, int> = 0> _CONSTEXPR20 void swap(variant<_Types...>& _Left, variant<_Types...>& _Right) noexcept(noexcept(_Left.swap(_Right))) { @@ -1702,16 +1676,6 @@ struct hash> : _Conditionally_enabled_hash } }; -template <> -struct hash { - using _ARGUMENT_TYPE_NAME _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS = monostate; - using _RESULT_TYPE_NAME _CXX17_DEPRECATE_ADAPTOR_TYPEDEFS = size_t; - - _NODISCARD _STATIC_CALL_OPERATOR size_t operator()(monostate) _CONST_CALL_OPERATOR noexcept { - return 1729; // Arbitrary value - } -}; - _STD_END #undef _STL_STAMP diff --git a/stl/inc/xutility b/stl/inc/xutility index fbce0c9df7c..d93f3b606d5 100644 --- a/stl/inc/xutility +++ b/stl/inc/xutility @@ -7568,10 +7568,6 @@ struct _CXX17_DEPRECATE_ITERATOR_BASE_CLASS iterator { // base type for iterator using reference = _Reference; }; -#if _HAS_CXX17 -_EXPORT_STD struct monostate {}; -#endif // _HAS_CXX17 - #if _HAS_CXX23 template <_Integer_like _Int> _NODISCARD constexpr bool _Add_overflow(const _Int _Left, const _Int _Right, _Int& _Out) { diff --git a/stl/inc/yvals_core.h b/stl/inc/yvals_core.h index 2e1f7472d11..fcbb50a4692 100644 --- a/stl/inc/yvals_core.h +++ b/stl/inc/yvals_core.h @@ -120,6 +120,7 @@ // P0426R1 constexpr For char_traits // P0433R2 Deduction Guides For The STL // P0452R1 Unifying Parallel Algorithms +// P0472R3 Put monostate In // P0504R0 Revisiting in_place_t/in_place_type_t/in_place_index_t // P0505R0 constexpr For (Again) // P0508R0 Clarifying insert_return_type