@@ -205,6 +205,7 @@ namespace std {
205205# include < __type_traits/is_assignable.h>
206206# include < __type_traits/is_constructible.h>
207207# include < __type_traits/is_convertible.h>
208+ # include < __type_traits/is_core_convertible.h>
208209# include < __type_traits/is_destructible.h>
209210# include < __type_traits/is_nothrow_assignable.h>
210211# include < __type_traits/is_nothrow_constructible.h>
@@ -982,11 +983,13 @@ public:
982983template <class _Tp >
983984optional (_Tp) -> optional<_Tp>;
984985
985- // Comparisons between optionals
986+ // [optional.relops] Relational operators
987+
986988template <
987989 class _Tp ,
988990 class _Up ,
989- enable_if_t <is_convertible_v<decltype (std::declval<const _Tp&>() == std::declval<const _Up&>()), bool >, int > = 0 >
991+ enable_if_t <__is_core_convertible_v<decltype (std::declval<const _Tp&>() == std::declval<const _Up&>()), bool >,
992+ int > = 0 >
990993_LIBCPP_HIDE_FROM_ABI constexpr bool operator ==(const optional<_Tp>& __x, const optional<_Up>& __y) {
991994 if (static_cast <bool >(__x) != static_cast <bool >(__y))
992995 return false ;
@@ -998,7 +1001,8 @@ _LIBCPP_HIDE_FROM_ABI constexpr bool operator==(const optional<_Tp>& __x, const
9981001template <
9991002 class _Tp ,
10001003 class _Up ,
1001- enable_if_t <is_convertible_v<decltype (std::declval<const _Tp&>() != std::declval<const _Up&>()), bool >, int > = 0 >
1004+ enable_if_t <__is_core_convertible_v<decltype (std::declval<const _Tp&>() != std::declval<const _Up&>()), bool >,
1005+ int > = 0 >
10021006_LIBCPP_HIDE_FROM_ABI constexpr bool operator !=(const optional<_Tp>& __x, const optional<_Up>& __y) {
10031007 if (static_cast <bool >(__x) != static_cast <bool >(__y))
10041008 return true ;
@@ -1007,10 +1011,10 @@ _LIBCPP_HIDE_FROM_ABI constexpr bool operator!=(const optional<_Tp>& __x, const
10071011 return *__x != *__y;
10081012}
10091013
1010- template <
1011- class _Tp ,
1012- class _Up ,
1013- enable_if_t <is_convertible_v< decltype (std::declval< const _Tp&>() < std::declval< const _Up&>()), bool >, int > = 0 >
1014+ template < class _Tp ,
1015+ class _Up ,
1016+ enable_if_t <__is_core_convertible_v< decltype (std::declval< const _Tp&>() < std::declval< const _Up&>()), bool > ,
1017+ int > = 0 >
10141018_LIBCPP_HIDE_FROM_ABI constexpr bool operator <(const optional<_Tp>& __x, const optional<_Up>& __y) {
10151019 if (!static_cast <bool >(__y))
10161020 return false ;
@@ -1019,10 +1023,10 @@ _LIBCPP_HIDE_FROM_ABI constexpr bool operator<(const optional<_Tp>& __x, const o
10191023 return *__x < *__y;
10201024}
10211025
1022- template <
1023- class _Tp ,
1024- class _Up ,
1025- enable_if_t <is_convertible_v< decltype (std::declval< const _Tp&>() > std::declval< const _Up&>()), bool >, int > = 0 >
1026+ template < class _Tp ,
1027+ class _Up ,
1028+ enable_if_t <__is_core_convertible_v< decltype (std::declval< const _Tp&>() > std::declval< const _Up&>()), bool > ,
1029+ int > = 0 >
10261030_LIBCPP_HIDE_FROM_ABI constexpr bool operator >(const optional<_Tp>& __x, const optional<_Up>& __y) {
10271031 if (!static_cast <bool >(__x))
10281032 return false ;
@@ -1034,7 +1038,8 @@ _LIBCPP_HIDE_FROM_ABI constexpr bool operator>(const optional<_Tp>& __x, const o
10341038template <
10351039 class _Tp ,
10361040 class _Up ,
1037- enable_if_t <is_convertible_v<decltype (std::declval<const _Tp&>() <= std::declval<const _Up&>()), bool >, int > = 0 >
1041+ enable_if_t <__is_core_convertible_v<decltype (std::declval<const _Tp&>() <= std::declval<const _Up&>()), bool >,
1042+ int > = 0 >
10381043_LIBCPP_HIDE_FROM_ABI constexpr bool operator <=(const optional<_Tp>& __x, const optional<_Up>& __y) {
10391044 if (!static_cast <bool >(__x))
10401045 return true ;
@@ -1046,7 +1051,8 @@ _LIBCPP_HIDE_FROM_ABI constexpr bool operator<=(const optional<_Tp>& __x, const
10461051template <
10471052 class _Tp ,
10481053 class _Up ,
1049- enable_if_t <is_convertible_v<decltype (std::declval<const _Tp&>() >= std::declval<const _Up&>()), bool >, int > = 0 >
1054+ enable_if_t <__is_core_convertible_v<decltype (std::declval<const _Tp&>() >= std::declval<const _Up&>()), bool >,
1055+ int > = 0 >
10501056_LIBCPP_HIDE_FROM_ABI constexpr bool operator >=(const optional<_Tp>& __x, const optional<_Up>& __y) {
10511057 if (!static_cast <bool >(__y))
10521058 return true ;
@@ -1067,7 +1073,8 @@ operator<=>(const optional<_Tp>& __x, const optional<_Up>& __y) {
10671073
10681074# endif // _LIBCPP_STD_VER >= 20
10691075
1070- // Comparisons with nullopt
1076+ // [optional.nullops] Comparison with nullopt
1077+
10711078template <class _Tp >
10721079_LIBCPP_HIDE_FROM_ABI constexpr bool operator ==(const optional<_Tp>& __x, nullopt_t ) noexcept {
10731080 return !static_cast <bool >(__x);
@@ -1139,99 +1146,108 @@ _LIBCPP_HIDE_FROM_ABI constexpr strong_ordering operator<=>(const optional<_Tp>&
11391146
11401147# endif // _LIBCPP_STD_VER <= 17
11411148
1142- // Comparisons with T
1149+ // [optional.comp.with.t] Comparison with T
1150+
11431151template <
11441152 class _Tp ,
11451153 class _Up ,
1146- enable_if_t <is_convertible_v<decltype (std::declval<const _Tp&>() == std::declval<const _Up&>()), bool >, int > = 0 >
1154+ enable_if_t <__is_core_convertible_v<decltype (std::declval<const _Tp&>() == std::declval<const _Up&>()), bool >,
1155+ int > = 0 >
11471156_LIBCPP_HIDE_FROM_ABI constexpr bool operator ==(const optional<_Tp>& __x, const _Up& __v) {
11481157 return static_cast <bool >(__x) ? *__x == __v : false ;
11491158}
11501159
11511160template <
11521161 class _Tp ,
11531162 class _Up ,
1154- enable_if_t <is_convertible_v<decltype (std::declval<const _Tp&>() == std::declval<const _Up&>()), bool >, int > = 0 >
1163+ enable_if_t <__is_core_convertible_v<decltype (std::declval<const _Tp&>() == std::declval<const _Up&>()), bool >,
1164+ int > = 0 >
11551165_LIBCPP_HIDE_FROM_ABI constexpr bool operator ==(const _Tp& __v, const optional<_Up>& __x) {
11561166 return static_cast <bool >(__x) ? __v == *__x : false ;
11571167}
11581168
11591169template <
11601170 class _Tp ,
11611171 class _Up ,
1162- enable_if_t <is_convertible_v<decltype (std::declval<const _Tp&>() != std::declval<const _Up&>()), bool >, int > = 0 >
1172+ enable_if_t <__is_core_convertible_v<decltype (std::declval<const _Tp&>() != std::declval<const _Up&>()), bool >,
1173+ int > = 0 >
11631174_LIBCPP_HIDE_FROM_ABI constexpr bool operator !=(const optional<_Tp>& __x, const _Up& __v) {
11641175 return static_cast <bool >(__x) ? *__x != __v : true ;
11651176}
11661177
11671178template <
11681179 class _Tp ,
11691180 class _Up ,
1170- enable_if_t <is_convertible_v<decltype (std::declval<const _Tp&>() != std::declval<const _Up&>()), bool >, int > = 0 >
1181+ enable_if_t <__is_core_convertible_v<decltype (std::declval<const _Tp&>() != std::declval<const _Up&>()), bool >,
1182+ int > = 0 >
11711183_LIBCPP_HIDE_FROM_ABI constexpr bool operator !=(const _Tp& __v, const optional<_Up>& __x) {
11721184 return static_cast <bool >(__x) ? __v != *__x : true ;
11731185}
11741186
1175- template <
1176- class _Tp ,
1177- class _Up ,
1178- enable_if_t <is_convertible_v< decltype (std::declval< const _Tp&>() < std::declval< const _Up&>()), bool >, int > = 0 >
1187+ template < class _Tp ,
1188+ class _Up ,
1189+ enable_if_t <__is_core_convertible_v< decltype (std::declval< const _Tp&>() < std::declval< const _Up&>()), bool > ,
1190+ int > = 0 >
11791191_LIBCPP_HIDE_FROM_ABI constexpr bool operator <(const optional<_Tp>& __x, const _Up& __v) {
11801192 return static_cast <bool >(__x) ? *__x < __v : true ;
11811193}
11821194
1183- template <
1184- class _Tp ,
1185- class _Up ,
1186- enable_if_t <is_convertible_v< decltype (std::declval< const _Tp&>() < std::declval< const _Up&>()), bool >, int > = 0 >
1195+ template < class _Tp ,
1196+ class _Up ,
1197+ enable_if_t <__is_core_convertible_v< decltype (std::declval< const _Tp&>() < std::declval< const _Up&>()), bool > ,
1198+ int > = 0 >
11871199_LIBCPP_HIDE_FROM_ABI constexpr bool operator <(const _Tp& __v, const optional<_Up>& __x) {
11881200 return static_cast <bool >(__x) ? __v < *__x : false ;
11891201}
11901202
11911203template <
11921204 class _Tp ,
11931205 class _Up ,
1194- enable_if_t <is_convertible_v<decltype (std::declval<const _Tp&>() <= std::declval<const _Up&>()), bool >, int > = 0 >
1206+ enable_if_t <__is_core_convertible_v<decltype (std::declval<const _Tp&>() <= std::declval<const _Up&>()), bool >,
1207+ int > = 0 >
11951208_LIBCPP_HIDE_FROM_ABI constexpr bool operator <=(const optional<_Tp>& __x, const _Up& __v) {
11961209 return static_cast <bool >(__x) ? *__x <= __v : true ;
11971210}
11981211
11991212template <
12001213 class _Tp ,
12011214 class _Up ,
1202- enable_if_t <is_convertible_v<decltype (std::declval<const _Tp&>() <= std::declval<const _Up&>()), bool >, int > = 0 >
1215+ enable_if_t <__is_core_convertible_v<decltype (std::declval<const _Tp&>() <= std::declval<const _Up&>()), bool >,
1216+ int > = 0 >
12031217_LIBCPP_HIDE_FROM_ABI constexpr bool operator <=(const _Tp& __v, const optional<_Up>& __x) {
12041218 return static_cast <bool >(__x) ? __v <= *__x : false ;
12051219}
12061220
1207- template <
1208- class _Tp ,
1209- class _Up ,
1210- enable_if_t <is_convertible_v< decltype (std::declval< const _Tp&>() > std::declval< const _Up&>()), bool >, int > = 0 >
1221+ template < class _Tp ,
1222+ class _Up ,
1223+ enable_if_t <__is_core_convertible_v< decltype (std::declval< const _Tp&>() > std::declval< const _Up&>()), bool > ,
1224+ int > = 0 >
12111225_LIBCPP_HIDE_FROM_ABI constexpr bool operator >(const optional<_Tp>& __x, const _Up& __v) {
12121226 return static_cast <bool >(__x) ? *__x > __v : false ;
12131227}
12141228
1215- template <
1216- class _Tp ,
1217- class _Up ,
1218- enable_if_t <is_convertible_v< decltype (std::declval< const _Tp&>() > std::declval< const _Up&>()), bool >, int > = 0 >
1229+ template < class _Tp ,
1230+ class _Up ,
1231+ enable_if_t <__is_core_convertible_v< decltype (std::declval< const _Tp&>() > std::declval< const _Up&>()), bool > ,
1232+ int > = 0 >
12191233_LIBCPP_HIDE_FROM_ABI constexpr bool operator >(const _Tp& __v, const optional<_Up>& __x) {
12201234 return static_cast <bool >(__x) ? __v > *__x : true ;
12211235}
12221236
12231237template <
12241238 class _Tp ,
12251239 class _Up ,
1226- enable_if_t <is_convertible_v<decltype (std::declval<const _Tp&>() >= std::declval<const _Up&>()), bool >, int > = 0 >
1240+ enable_if_t <__is_core_convertible_v<decltype (std::declval<const _Tp&>() >= std::declval<const _Up&>()), bool >,
1241+ int > = 0 >
12271242_LIBCPP_HIDE_FROM_ABI constexpr bool operator >=(const optional<_Tp>& __x, const _Up& __v) {
12281243 return static_cast <bool >(__x) ? *__x >= __v : false ;
12291244}
12301245
12311246template <
12321247 class _Tp ,
12331248 class _Up ,
1234- enable_if_t <is_convertible_v<decltype (std::declval<const _Tp&>() >= std::declval<const _Up&>()), bool >, int > = 0 >
1249+ enable_if_t <__is_core_convertible_v<decltype (std::declval<const _Tp&>() >= std::declval<const _Up&>()), bool >,
1250+ int > = 0 >
12351251_LIBCPP_HIDE_FROM_ABI constexpr bool operator >=(const _Tp& __v, const optional<_Up>& __x) {
12361252 return static_cast <bool >(__x) ? __v >= *__x : true ;
12371253}
0 commit comments