30#ifndef _GLIBCXX_OPTIONAL
31#define _GLIBCXX_OPTIONAL 1
34#pragma GCC system_header
37#define __glibcxx_want_freestanding_optional
38#define __glibcxx_want_optional
39#define __glibcxx_want_optional_range_support
40#define __glibcxx_want_constrained_equality
41#define __glibcxx_want_constexpr_exceptions
42#define __glibcxx_want_hardened_optional
45#ifdef __cpp_lib_optional
57#if __cplusplus > 201703L
61#if __cplusplus > 202002L
64#ifdef __cpp_lib_optional_range_support
72namespace std _GLIBCXX_VISIBILITY(default)
74_GLIBCXX_BEGIN_NAMESPACE_VERSION
86 class bad_optional_access :
public exception
89 bad_optional_access() =
default;
90 virtual ~bad_optional_access() =
default;
92#if __cpp_lib_constexpr_exceptions >= 202502L
95 const char* what() const noexcept
override
96 {
return "bad optional access"; }
101#if __cpp_lib_constexpr_exceptions >= 202502L
107 __throw_bad_optional_access()
108 { _GLIBCXX_THROW_OR_ABORT(bad_optional_access()); }
112 template <
typename _Tp>
113 struct _Optional_payload_base
115 using _Stored_type = remove_const_t<_Tp>;
117 _Optional_payload_base() =
default;
118 ~_Optional_payload_base() =
default;
120 template<
typename... _Args>
122 _Optional_payload_base(in_place_t __tag, _Args&&... __args)
123 : _M_payload(__tag, std::
forward<_Args>(__args)...),
127 template<
typename _Up,
typename... _Args>
129 _Optional_payload_base(std::initializer_list<_Up> __il,
131 : _M_payload(__il, std::
forward<_Args>(__args)...),
138 _Optional_payload_base(
bool ,
139 const _Optional_payload_base& __other)
141 if (__other._M_engaged)
142 this->_M_construct(__other._M_get());
148 _Optional_payload_base(
bool ,
149 _Optional_payload_base&& __other)
151 if (__other._M_engaged)
152 this->_M_construct(
std::move(__other._M_get()));
157 _Optional_payload_base(
const _Optional_payload_base&) =
default;
161 _Optional_payload_base(_Optional_payload_base&&) =
default;
163 _Optional_payload_base&
164 operator=(
const _Optional_payload_base&) =
default;
166 _Optional_payload_base&
167 operator=(_Optional_payload_base&&) =
default;
171 _M_copy_assign(
const _Optional_payload_base& __other)
173 if (this->_M_engaged && __other._M_engaged)
174 this->_M_get() = __other._M_get();
177 if (__other._M_engaged)
178 this->_M_construct(__other._M_get());
186 _M_move_assign(_Optional_payload_base&& __other)
187 noexcept(__and_v<is_nothrow_move_constructible<_Tp>,
188 is_nothrow_move_assignable<_Tp>>)
190 if (this->_M_engaged && __other._M_engaged)
191 this->_M_get() =
std::move(__other._M_get());
194 if (__other._M_engaged)
195 this->_M_construct(
std::move(__other._M_get()));
201 struct _Empty_byte { };
203 template<
typename _Up,
bool = is_trivially_destructible_v<_Up>>
206 constexpr _Storage() noexcept : _M_empty() { }
208 template<
typename... _Args>
210 _Storage(in_place_t, _Args&&... __args)
211 : _M_value(std::
forward<_Args>(__args)...)
214 template<
typename _Vp,
typename... _Args>
216 _Storage(std::initializer_list<_Vp> __il, _Args&&... __args)
217 : _M_value(__il, std::
forward<_Args>(__args)...)
220#if __cplusplus >= 202002L
221 template<
typename _Fn,
typename _Arg>
223 _Storage(_Optional_func<_Fn> __f, _Arg&& __arg)
229#if __cpp_concepts >= 202002L
230 ~_Storage() =
default;
234 ~_Storage()
requires (!is_trivially_destructible_v<_Up>)
237 _Storage(
const _Storage&) =
default;
238 _Storage(_Storage&&) =
default;
239 _Storage& operator=(
const _Storage&) =
default;
240 _Storage& operator=(_Storage&&) =
default;
243 _Empty_byte _M_empty;
247#if __cpp_concepts < 202002L
248 template<
typename _Up>
249 union _Storage<_Up, false>
251 constexpr _Storage() noexcept : _M_empty() { }
253 template<
typename... _Args>
255 _Storage(in_place_t, _Args&&... __args)
256 : _M_value(std::
forward<_Args>(__args)...)
259 template<
typename _Vp,
typename... _Args>
261 _Storage(std::initializer_list<_Vp> __il, _Args&&... __args)
262 : _M_value(__il, std::
forward<_Args>(__args)...)
265#if __cplusplus >= 202002L
266 template<
typename _Fn,
typename _Arg>
268 _Storage(_Optional_func<_Fn> __f, _Arg&& __arg)
275 _GLIBCXX20_CONSTEXPR ~_Storage() { }
277 _Storage(
const _Storage&) =
default;
278 _Storage(_Storage&&) =
default;
279 _Storage& operator=(
const _Storage&) =
default;
280 _Storage& operator=(_Storage&&) =
default;
282 _Empty_byte _M_empty;
287 _Storage<_Stored_type> _M_payload;
289 bool _M_engaged =
false;
291 template<
typename... _Args>
293 _M_construct(_Args&&... __args)
294 noexcept(is_nothrow_constructible_v<_Stored_type, _Args...>)
298 this->_M_engaged =
true;
302 _M_destroy() noexcept
305 _M_payload._M_value.~_Stored_type();
308 __builtin_unreachable();
309#if defined(__clang__) && __cpp_lib_optional >= 202106L
310 if (std::is_constant_evaluated())
316#if __cplusplus >= 202002L
317 template<
typename _Fn,
typename _Up>
319 _M_apply(_Optional_func<_Fn> __f, _Up&& __x)
333 {
return this->_M_payload._M_value; }
336 _M_get() const noexcept
337 {
return this->_M_payload._M_value; }
343 if (this->_M_engaged)
346 this->_M_engaged =
false;
351 template <
typename _Tp,
353 is_trivially_destructible_v<_Tp>,
355 is_trivially_copy_assignable_v<_Tp>
356 && is_trivially_copy_constructible_v<_Tp>,
358 is_trivially_move_assignable_v<_Tp>
359 && is_trivially_move_constructible_v<_Tp>>
360 struct _Optional_payload;
363 template <
typename _Tp>
364 struct _Optional_payload<_Tp, true, true, true>
365 : _Optional_payload_base<_Tp>
367 using _Optional_payload_base<_Tp>::_Optional_payload_base;
369 _Optional_payload() =
default;
373 template <
typename _Tp>
374 struct _Optional_payload<_Tp, true, false, true>
375 : _Optional_payload_base<_Tp>
377 using _Optional_payload_base<_Tp>::_Optional_payload_base;
379 _Optional_payload() =
default;
380 ~_Optional_payload() =
default;
381 _Optional_payload(
const _Optional_payload&) =
default;
382 _Optional_payload(_Optional_payload&&) =
default;
383 _Optional_payload& operator=(_Optional_payload&&) =
default;
388 operator=(
const _Optional_payload& __other)
390 this->_M_copy_assign(__other);
396 template <
typename _Tp>
397 struct _Optional_payload<_Tp, true, true, false>
398 : _Optional_payload_base<_Tp>
400 using _Optional_payload_base<_Tp>::_Optional_payload_base;
402 _Optional_payload() =
default;
403 ~_Optional_payload() =
default;
404 _Optional_payload(
const _Optional_payload&) =
default;
405 _Optional_payload(_Optional_payload&&) =
default;
406 _Optional_payload& operator=(
const _Optional_payload&) =
default;
411 operator=(_Optional_payload&& __other)
412 noexcept(__and_v<is_nothrow_move_constructible<_Tp>,
413 is_nothrow_move_assignable<_Tp>>)
415 this->_M_move_assign(
std::move(__other));
421 template <
typename _Tp>
422 struct _Optional_payload<_Tp, true, false, false>
423 : _Optional_payload_base<_Tp>
425 using _Optional_payload_base<_Tp>::_Optional_payload_base;
427 _Optional_payload() =
default;
428 ~_Optional_payload() =
default;
429 _Optional_payload(
const _Optional_payload&) =
default;
430 _Optional_payload(_Optional_payload&&) =
default;
435 operator=(
const _Optional_payload& __other)
437 this->_M_copy_assign(__other);
444 operator=(_Optional_payload&& __other)
445 noexcept(__and_v<is_nothrow_move_constructible<_Tp>,
446 is_nothrow_move_assignable<_Tp>>)
448 this->_M_move_assign(
std::move(__other));
454 template <
typename _Tp,
bool _Copy,
bool _Move>
455 struct _Optional_payload<_Tp, false, _Copy, _Move>
456 : _Optional_payload<_Tp, true, false, false>
459 using _Optional_payload<_Tp,
true,
false,
false>::_Optional_payload;
460 _Optional_payload() =
default;
461 _Optional_payload(
const _Optional_payload&) =
default;
462 _Optional_payload(_Optional_payload&&) =
default;
463 _Optional_payload& operator=(
const _Optional_payload&) =
default;
464 _Optional_payload& operator=(_Optional_payload&&) =
default;
467 _GLIBCXX20_CONSTEXPR ~_Optional_payload() { this->_M_reset(); }
488 template<
typename _Tp,
489 bool = is_trivially_copy_constructible_v<_Tp>,
490 bool = is_trivially_move_constructible_v<_Tp>>
491 struct _Optional_base
494 constexpr _Optional_base() =
default;
497 template<
typename... _Args,
498 enable_if_t<is_constructible_v<_Tp, _Args...>,
bool> =
false>
500 _Optional_base(in_place_t, _Args&&... __args)
501 : _M_payload(in_place, std::
forward<_Args>(__args)...)
504 template<
typename _Up,
typename... _Args,
506 initializer_list<_Up>&,
507 _Args...>,
bool> =
false>
509 _Optional_base(in_place_t,
510 initializer_list<_Up> __il,
512 : _M_payload(in_place, __il, std::
forward<_Args>(__args)...)
517 _Optional_base(
const _Optional_base& __other)
518 noexcept(is_nothrow_copy_constructible_v<_Tp>)
519 : _M_payload(__other._M_payload._M_engaged, __other._M_payload)
523 _Optional_base(_Optional_base&& __other)
524 noexcept(is_nothrow_move_constructible_v<_Tp>)
525 : _M_payload(__other._M_payload._M_engaged,
526 std::move(__other._M_payload))
529#if __cpp_concepts >= 202002L
532 constexpr _Optional_base(
const _Optional_base&)
533 requires is_trivially_copy_constructible_v<_Tp> =
default;
535 constexpr _Optional_base(_Optional_base&&)
536 requires is_trivially_move_constructible_v<_Tp> = default;
540 _Optional_base& operator=(
const _Optional_base&) =
default;
541 _Optional_base& operator=(_Optional_base&&) =
default;
543 _Optional_payload<_Tp> _M_payload;
547 using _Stored_type = remove_const_t<_Tp>;
551 template<
typename... _Args>
553 _M_construct(_Args&&... __args)
554 noexcept(is_nothrow_constructible_v<_Stored_type, _Args...>)
560 _M_destruct() noexcept
561 { _M_payload._M_destroy(); }
566 { _M_payload._M_reset(); }
568 constexpr bool _M_is_engaged() const noexcept
569 {
return _M_payload._M_engaged; }
574 {
return _M_payload._M_get(); }
577 _M_get() const noexcept
578 {
return _M_payload._M_get(); }
581#if __cpp_concepts < 202002L
592 template<
typename _Tp,
typename _Dp>
593 class _Optional_base_impl
596 using _Stored_type = remove_const_t<_Tp>;
600 template<
typename... _Args>
602 _M_construct(_Args&&... __args)
603 noexcept(is_nothrow_constructible_v<_Stored_type, _Args...>)
605 static_cast<_Dp*
>(
this)->_M_payload._M_construct(
610 _M_destruct() noexcept
611 {
static_cast<_Dp*
>(
this)->_M_payload._M_destroy(); }
616 {
static_cast<_Dp*
>(
this)->_M_payload._M_reset(); }
618 constexpr bool _M_is_engaged() const noexcept
619 {
return static_cast<const _Dp*
>(
this)->_M_payload._M_engaged; }
624 {
return static_cast<_Dp*
>(
this)->_M_payload._M_get(); }
627 _M_get() const noexcept
628 {
return static_cast<const _Dp*
>(
this)->_M_payload._M_get(); }
631 template<
typename _Tp>
632 struct _Optional_base<_Tp, false, true>
633 : _Optional_base_impl<_Tp, _Optional_base<_Tp>>
636 constexpr _Optional_base() =
default;
639 template<
typename... _Args,
640 enable_if_t<is_constructible_v<_Tp, _Args...>,
bool> =
false>
642 _Optional_base(in_place_t, _Args&&... __args)
643 : _M_payload(in_place, std::
forward<_Args>(__args)...)
646 template<
typename _Up,
typename... _Args,
648 initializer_list<_Up>&,
649 _Args...>,
bool> =
false>
651 _Optional_base(in_place_t,
652 initializer_list<_Up> __il,
654 : _M_payload(in_place, __il, std::
forward<_Args>(__args)...)
658 constexpr _Optional_base(
const _Optional_base& __other)
659 : _M_payload(__other._M_payload._M_engaged, __other._M_payload)
662 constexpr _Optional_base(_Optional_base&& __other) =
default;
665 _Optional_base& operator=(
const _Optional_base&) =
default;
666 _Optional_base& operator=(_Optional_base&&) =
default;
668 _Optional_payload<_Tp> _M_payload;
671 template<
typename _Tp>
672 struct _Optional_base<_Tp, true, false>
673 : _Optional_base_impl<_Tp, _Optional_base<_Tp>>
676 constexpr _Optional_base() =
default;
679 template<
typename... _Args,
680 enable_if_t<is_constructible_v<_Tp, _Args...>,
bool> =
false>
682 _Optional_base(in_place_t, _Args&&... __args)
683 : _M_payload(in_place, std::
forward<_Args>(__args)...)
686 template<
typename _Up,
typename... _Args,
689 _Args...>,
bool> =
false>
691 _Optional_base(in_place_t,
694 : _M_payload(in_place, __il, std::
forward<_Args>(__args)...)
698 constexpr _Optional_base(
const _Optional_base& __other) =
default;
701 _Optional_base(_Optional_base&& __other)
702 noexcept(is_nothrow_move_constructible_v<_Tp>)
703 : _M_payload(__other._M_payload._M_engaged,
704 std::
move(__other._M_payload))
708 _Optional_base& operator=(
const _Optional_base&) =
default;
709 _Optional_base& operator=(_Optional_base&&) =
default;
711 _Optional_payload<_Tp> _M_payload;
714 template<
typename _Tp>
715 struct _Optional_base<_Tp, true, true>
716 : _Optional_base_impl<_Tp, _Optional_base<_Tp>>
719 constexpr _Optional_base() =
default;
722 template<
typename... _Args,
723 enable_if_t<is_constructible_v<_Tp, _Args...>,
bool> =
false>
725 _Optional_base(in_place_t, _Args&&... __args)
726 : _M_payload(in_place, std::
forward<_Args>(__args)...)
729 template<
typename _Up,
typename... _Args,
732 _Args...>,
bool> =
false>
734 _Optional_base(in_place_t,
737 : _M_payload(in_place, __il, std::
forward<_Args>(__args)...)
741 constexpr _Optional_base(
const _Optional_base& __other) =
default;
742 constexpr _Optional_base(_Optional_base&& __other) =
default;
745 _Optional_base& operator=(
const _Optional_base&) =
default;
746 _Optional_base& operator=(_Optional_base&&) =
default;
748 _Optional_payload<_Tp> _M_payload;
752 template<
typename _Tp>
753 inline constexpr bool __is_optional_v =
false;
754 template<
typename _Tp>
755 inline constexpr bool __is_optional_v<optional<_Tp>> =
true;
757 template<
typename _Tp,
typename _Wp>
758 using __converts_from_any_cvref = __or_<
765 template<
typename _Tp,
typename _Up>
766 using __converts_from_optional
767 = __converts_from_any_cvref<_Tp, optional<_Up>>;
769 template<
typename _Tp,
typename _Up>
770 using __assigns_from_optional =
771 __or_<is_assignable<_Tp&, const optional<_Up>&>,
776#if __cpp_concepts && __cpp_conditional_explicit && __glibcxx_remove_cvref
777# define _GLIBCXX_USE_CONSTRAINTS_FOR_OPTIONAL 1
783 template<
typename _Tp>
785 :
private _Optional_base<_Tp>,
786 private _Enable_copy_move<
788 is_copy_constructible_v<_Tp>,
790 __and_v<is_copy_constructible<_Tp>, is_copy_assignable<_Tp>>,
792 is_move_constructible_v<_Tp>,
794 __and_v<is_move_constructible<_Tp>, is_move_assignable<_Tp>>,
798 static_assert(__is_valid_contained_type_for_optional<_Tp>);
801 using _Base = _Optional_base<_Tp>;
809#ifdef _GLIBCXX_USE_CONSTRAINTS_FOR_OPTIONAL
810 template<
typename _From,
typename = remove_cv_t<_Tp>>
811 static constexpr bool __not_constructing_bool_from_optional
816 template<
typename _From>
817 static constexpr bool
818 __not_constructing_bool_from_optional<_From, bool>
819 = !__is_optional_v<remove_cvref_t<_From>>;
825 template<
typename _From,
typename = remove_cv_t<_Tp>>
826 static constexpr bool __construct_from_contained_value
827 = !__converts_from_optional<_Tp, _From>::value;
831 template<
typename _From>
832 static constexpr bool __construct_from_contained_value<_From, bool>
835 template<
typename _From,
typename = remove_cv_t<_Tp>>
836 struct __not_constructing_bool_from_optional
840 template<
typename _From>
841 struct __not_constructing_bool_from_optional<_From, bool>
842 : bool_constant<!__is_optional_v<__remove_cvref_t<_From>>>
845 template<
typename _From,
typename = remove_cv_t<_Tp>>
846 struct __construct_from_contained_value
847 : __not_<__converts_from_optional<_Tp, _From>>
850 template<
typename _From>
851 struct __construct_from_contained_value<_From, bool>
855 template<
typename _Up>
856 using __not_self = __not_<is_same<optional, __remove_cvref_t<_Up>>>;
857 template<
typename _Up>
858 using __not_tag = __not_<is_same<in_place_t, __remove_cvref_t<_Up>>>;
859 template<
typename... _Cond>
860 using _Requires =
enable_if_t<__and_v<_Cond...>,
bool>;
864 using value_type = _Tp;
865#ifdef __cpp_lib_optional_range_support
866 using iterator = __gnu_cxx::__normal_iterator<_Tp*, optional>;
867 using const_iterator = __gnu_cxx::__normal_iterator<const _Tp*, optional>;
870 constexpr optional() noexcept { }
872 constexpr optional(nullopt_t)
noexcept { }
875#ifdef _GLIBCXX_USE_CONSTRAINTS_FOR_OPTIONAL
876 template<
typename _Up = remove_cv_t<_Tp>>
877 requires (!is_same_v<optional, remove_cvref_t<_Up>>)
878 && (!is_same_v<in_place_t, remove_cvref_t<_Up>>)
879 && is_constructible_v<_Tp, _Up>
880 && __not_constructing_bool_from_optional<_Up>
881 constexpr explicit(!is_convertible_v<_Up, _Tp>)
883 noexcept(is_nothrow_constructible_v<_Tp, _Up>)
884 : _Base(std::in_place, std::
forward<_Up>(__t)) { }
886 template<
typename _Up>
887 requires (!is_same_v<_Tp, _Up>)
888 && is_constructible_v<_Tp, const _Up&>
889 && __construct_from_contained_value<_Up>
890 constexpr explicit(!is_convertible_v<const _Up&, _Tp>)
891 optional(
const optional<_Up>& __t)
892 noexcept(is_nothrow_constructible_v<_Tp, const _Up&>)
895 emplace(__t._M_fwd());
898 template<
typename _Up>
899 requires (!is_same_v<_Tp, _Up>)
900 && is_constructible_v<_Tp, _Up>
901 && __construct_from_contained_value<_Up>
902 constexpr explicit(!is_convertible_v<_Up, _Tp>)
903 optional(optional<_Up>&& __t)
904 noexcept(is_nothrow_constructible_v<_Tp, _Up>)
910 template<
typename... _Args>
911 requires is_constructible_v<_Tp, _Args...>
913 optional(in_place_t, _Args&&... __args)
914 noexcept(is_nothrow_constructible_v<_Tp, _Args...>)
915 : _Base(std::in_place, std::
forward<_Args>(__args)...)
918 template<
typename _Up,
typename... _Args>
919 requires is_constructible_v<_Tp, initializer_list<_Up>&, _Args...>
921 optional(in_place_t, initializer_list<_Up> __il, _Args&&... __args)
922 noexcept(is_nothrow_constructible_v<_Tp, initializer_list<_Up>&,
924 : _Base(std::in_place, __il, std::
forward<_Args>(__args)...)
927 template<
typename _Up = remove_cv_t<_Tp>,
928 _Requires<__not_self<_Up>, __not_tag<_Up>,
929 is_constructible<_Tp, _Up>,
930 is_convertible<_Up, _Tp>,
931 __not_constructing_
bool_from_optional<_Up>> = true>
934 noexcept(is_nothrow_constructible_v<_Tp, _Up>)
935 : _Base(std::in_place, std::
forward<_Up>(__t)) { }
937 template<
typename _Up = remove_cv_t<_Tp>,
938 _Requires<__not_self<_Up>, __not_tag<_Up>,
939 is_constructible<_Tp, _Up>,
940 __not_<is_convertible<_Up, _Tp>>,
941 __not_constructing_
bool_from_optional<_Up>> = false>
944 noexcept(is_nothrow_constructible_v<_Tp, _Up>)
945 : _Base(std::in_place, std::
forward<_Up>(__t)) { }
947 template<
typename _Up,
948 _Requires<__not_<is_same<_Tp, _Up>>,
949 is_constructible<_Tp, const _Up&>,
950 is_convertible<const _Up&, _Tp>,
951 __construct_from_contained_value<_Up>> =
true>
953 optional(
const optional<_Up>& __t)
954 noexcept(is_nothrow_constructible_v<_Tp, const _Up&>)
957 emplace(__t._M_fwd());
960 template<
typename _Up,
961 _Requires<__not_<is_same<_Tp, _Up>>,
962 is_constructible<_Tp, const _Up&>,
963 __not_<is_convertible<const _Up&, _Tp>>,
964 __construct_from_contained_value<_Up>> =
false>
966 optional(
const optional<_Up>& __t)
967 noexcept(is_nothrow_constructible_v<_Tp, const _Up&>)
970 emplace(__t._M_fwd());
973 template<
typename _Up,
974 _Requires<__not_<is_same<_Tp, _Up>>,
975 is_constructible<_Tp, _Up>,
976 is_convertible<_Up, _Tp>,
977 __construct_from_contained_value<_Up>> =
true>
979 optional(optional<_Up>&& __t)
980 noexcept(is_nothrow_constructible_v<_Tp, _Up>)
986 template<
typename _Up,
987 _Requires<__not_<is_same<_Tp, _Up>>,
988 is_constructible<_Tp, _Up>,
989 __not_<is_convertible<_Up, _Tp>>,
990 __construct_from_contained_value<_Up>> =
false>
992 optional(optional<_Up>&& __t)
993 noexcept(is_nothrow_constructible_v<_Tp, _Up>)
999 template<
typename... _Args,
1000 _Requires<is_constructible<_Tp, _Args...>> =
false>
1002 optional(in_place_t, _Args&&... __args)
1003 noexcept(is_nothrow_constructible_v<_Tp, _Args...>)
1004 : _Base(std::in_place, std::
forward<_Args>(__args)...) { }
1006 template<
typename _Up,
typename... _Args,
1007 _Requires<is_constructible<_Tp,
1008 initializer_list<_Up>&,
1011 optional(in_place_t, initializer_list<_Up> __il, _Args&&... __args)
1012 noexcept(is_nothrow_constructible_v<_Tp, initializer_list<_Up>&,
1014 : _Base(std::in_place, __il, std::
forward<_Args>(__args)...) { }
1018 _GLIBCXX20_CONSTEXPR optional&
1019 operator=(nullopt_t)
noexcept
1025 template<
typename _Up = remove_cv_t<_Tp>>
1026#ifdef _GLIBCXX_USE_CONSTRAINTS_FOR_OPTIONAL
1027 requires (!is_same_v<optional, remove_cvref_t<_Up>>)
1028 && (!(is_scalar_v<_Tp> && is_same_v<_Tp,
decay_t<_Up>>))
1029 && is_constructible_v<_Tp, _Up>
1030 && is_assignable_v<_Tp&, _Up>
1034 __not_<__and_<is_scalar<_Tp>,
1035 is_same<_Tp, decay_t<_Up>>>>,
1036 is_constructible<_Tp, _Up>,
1037 is_assignable<_Tp&, _Up>>,
1040 operator=(_Up&& __u)
1041 noexcept(__and_v<is_nothrow_constructible<_Tp, _Up>,
1042 is_nothrow_assignable<_Tp&, _Up>>)
1044 if (this->_M_is_engaged())
1052 template<
typename _Up>
1053#ifdef _GLIBCXX_USE_CONSTRAINTS_FOR_OPTIONAL
1054 requires (!is_same_v<_Tp, _Up>)
1055 && is_constructible_v<_Tp, const _Up&>
1056 && is_assignable_v<_Tp&, const _Up&>
1057 && (!__converts_from_optional<_Tp, _Up>::value)
1058 && (!__assigns_from_optional<_Tp, _Up>::value)
1062 is_constructible<_Tp, const _Up&>,
1063 is_assignable<_Tp&, const _Up&>,
1064 __not_<__converts_from_optional<_Tp, _Up>>,
1065 __not_<__assigns_from_optional<_Tp, _Up>>>,
1068 operator=(
const optional<_Up>& __u)
1069 noexcept(__and_v<is_nothrow_constructible<_Tp, const _Up&>,
1070 is_nothrow_assignable<_Tp&, const _Up&>>)
1074 if (this->_M_is_engaged())
1075 this->_M_get() = __u._M_fwd();
1077 this->_M_construct(__u._M_fwd());
1086 template<
typename _Up>
1087#ifdef _GLIBCXX_USE_CONSTRAINTS_FOR_OPTIONAL
1088 requires (!is_same_v<_Tp, _Up>)
1089 && is_constructible_v<_Tp, _Up>
1090 && is_assignable_v<_Tp&, _Up>
1091 && (!__converts_from_optional<_Tp, _Up>::value)
1092 && (!__assigns_from_optional<_Tp, _Up>::value)
1096 is_constructible<_Tp, _Up>,
1097 is_assignable<_Tp&, _Up>,
1098 __not_<__converts_from_optional<_Tp, _Up>>,
1099 __not_<__assigns_from_optional<_Tp, _Up>>>,
1102 operator=(optional<_Up>&& __u)
1103 noexcept(__and_v<is_nothrow_constructible<_Tp, _Up>,
1104 is_nothrow_assignable<_Tp&, _Up>>)
1108 if (this->_M_is_engaged())
1109 this->_M_get() =
std::move(__u)._M_fwd();
1111 this->_M_construct(
std::move(__u)._M_fwd());
1123 template<
typename... _Args>
1124 _GLIBCXX20_CONSTEXPR
1125 enable_if_t<is_constructible_v<_Tp, _Args...>, _Tp&>
1126 emplace(_Args&&... __args)
1127 noexcept(is_nothrow_constructible_v<_Tp, _Args...>)
1131 return this->_M_get();
1134 template<
typename _Up,
typename... _Args>
1135 _GLIBCXX20_CONSTEXPR
1138 emplace(initializer_list<_Up> __il, _Args&&... __args)
1139 noexcept(is_nothrow_constructible_v<_Tp, initializer_list<_Up>&,
1144 return this->_M_get();
1150 _GLIBCXX20_CONSTEXPR
void
1151 swap(optional& __other)
1152 noexcept(is_nothrow_move_constructible_v<_Tp>
1153 && is_nothrow_swappable_v<_Tp>)
1157 if (this->_M_is_engaged() && __other._M_is_engaged())
1158 swap(this->_M_get(), __other._M_get());
1159 else if (this->_M_is_engaged())
1161 __other._M_construct(
std::move(this->_M_get()));
1162 this->_M_destruct();
1164 else if (__other._M_is_engaged())
1166 this->_M_construct(
std::move(__other._M_get()));
1167 __other._M_destruct();
1171#ifdef __cpp_lib_optional_range_support
1173 constexpr iterator
begin() noexcept
1180 constexpr const_iterator
begin() const noexcept
1182 return const_iterator(
1187 constexpr iterator
end() noexcept
1189 return begin() + has_value();
1192 constexpr const_iterator
end() const noexcept
1194 return begin() + has_value();
1199 constexpr const _Tp*
1200 operator->() const noexcept
1202 __glibcxx_assert(this->_M_is_engaged());
1207 operator->() noexcept
1209 __glibcxx_assert(this->_M_is_engaged());
1213 constexpr const _Tp&
1216 __glibcxx_assert(this->_M_is_engaged());
1217 return this->_M_get();
1223 __glibcxx_assert(this->_M_is_engaged());
1224 return this->_M_get();
1230 __glibcxx_assert(this->_M_is_engaged());
1234 constexpr const _Tp&&
1237 __glibcxx_assert(this->_M_is_engaged());
1241 constexpr explicit operator bool() const noexcept
1242 {
return this->_M_is_engaged(); }
1244 constexpr bool has_value() const noexcept
1245 {
return this->_M_is_engaged(); }
1247 constexpr const _Tp&
1250 if (this->_M_is_engaged())
1251 return this->_M_get();
1252 __throw_bad_optional_access();
1258 if (this->_M_is_engaged())
1259 return this->_M_get();
1260 __throw_bad_optional_access();
1266 if (this->_M_is_engaged())
1268 __throw_bad_optional_access();
1271 constexpr const _Tp&&
1274 if (this->_M_is_engaged())
1276 __throw_bad_optional_access();
1281 template<
typename _Up = remove_cv_t<_Tp>>
1282 constexpr remove_cv_t<_Tp>
1283 value_or(_Up&& __u)
const&
1285 using _Xp = remove_cv_t<_Tp>;
1286 static_assert(is_convertible_v<const _Tp&, _Xp>);
1287 static_assert(is_convertible_v<_Up, _Xp>);
1289 if (this->_M_is_engaged())
1290 return this->_M_get();
1294 template<
typename _Up = remove_cv_t<_Tp>>
1295 constexpr remove_cv_t<_Tp>
1296 value_or(_Up&& __u) &&
1298 using _Xp = remove_cv_t<_Tp>;
1299 static_assert(is_convertible_v<_Tp, _Xp>);
1300 static_assert(is_convertible_v<_Up, _Xp>);
1302 if (this->_M_is_engaged())
1307#if __cpp_lib_optional >= 202110L
1310 template<
typename _Fn>
1312 and_then(_Fn&& __f) &
1314 using _Up = remove_cvref_t<invoke_result_t<_Fn, _Tp&>>;
1315 static_assert(__is_optional_v<_Up>,
1316 "the function passed to std::optional<T>::and_then "
1317 "must return a std::optional");
1324 template<
typename _Fn>
1326 and_then(_Fn&& __f)
const &
1328 using _Up = remove_cvref_t<invoke_result_t<_Fn, const _Tp&>>;
1329 static_assert(__is_optional_v<_Up>,
1330 "the function passed to std::optional<T>::and_then "
1331 "must return a std::optional");
1338 template<
typename _Fn>
1340 and_then(_Fn&& __f) &&
1342 using _Up = remove_cvref_t<invoke_result_t<_Fn, _Tp>>;
1343 static_assert(__is_optional_v<_Up>,
1344 "the function passed to std::optional<T>::and_then "
1345 "must return a std::optional");
1352 template<
typename _Fn>
1354 and_then(_Fn&& __f)
const &&
1356 using _Up = remove_cvref_t<invoke_result_t<_Fn, const _Tp>>;
1357 static_assert(__is_optional_v<_Up>,
1358 "the function passed to std::optional<T>::and_then "
1359 "must return a std::optional");
1366 template<
typename _Fn>
1368 transform(_Fn&& __f) &
1370 using _Up = remove_cv_t<invoke_result_t<_Fn, _Tp&>>;
1372 return optional<_Up>(_Optional_func<_Fn>{__f}, _M_get());
1374 return optional<_Up>();
1377 template<
typename _Fn>
1379 transform(_Fn&& __f)
const &
1381 using _Up = remove_cv_t<invoke_result_t<_Fn, const _Tp&>>;
1383 return optional<_Up>(_Optional_func<_Fn>{__f}, _M_get());
1385 return optional<_Up>();
1388 template<
typename _Fn>
1390 transform(_Fn&& __f) &&
1392 using _Up = remove_cv_t<invoke_result_t<_Fn, _Tp>>;
1394 return optional<_Up>(_Optional_func<_Fn>{__f},
std::move(_M_get()));
1396 return optional<_Up>();
1399 template<
typename _Fn>
1401 transform(_Fn&& __f)
const &&
1403 using _Up = remove_cv_t<invoke_result_t<_Fn, const _Tp>>;
1405 return optional<_Up>(_Optional_func<_Fn>{__f},
std::move(_M_get()));
1407 return optional<_Up>();
1410 template<
typename _Fn>
requires invocable<_Fn> && copy_constructible<_Tp>
1412 or_else(_Fn&& __f)
const&
1414 using _Up = invoke_result_t<_Fn>;
1415 static_assert(is_same_v<remove_cvref_t<_Up>, optional>,
1416 "the function passed to std::optional<T>::or_else "
1417 "must return a std::optional<T>");
1425 template<
typename _Fn>
requires invocable<_Fn> && move_constructible<_Tp>
1427 or_else(_Fn&& __f) &&
1429 using _Up = invoke_result_t<_Fn>;
1430 static_assert(is_same_v<remove_cvref_t<_Up>, optional>,
1431 "the function passed to std::optional<T>::or_else "
1432 "must return a std::optional<T>");
1441 _GLIBCXX20_CONSTEXPR
void reset() noexcept { this->_M_reset(); }
1444 using _Base::_M_get;
1446 [[__gnu__::__always_inline__]]
1449 {
return _M_get(); }
1451 [[__gnu__::__always_inline__]]
1453 _M_fwd() &&
noexcept
1456 [[__gnu__::__always_inline__]]
1457 constexpr const _Tp&
1458 _M_fwd() const& noexcept
1459 {
return _M_get(); }
1461 [[__gnu__::__always_inline__]]
1462 constexpr const _Tp&&
1463 _M_fwd() const&& noexcept
1466 template<
typename _Up>
friend class optional;
1468#if __cpp_lib_optional >= 202110L
1469 template<
typename _Fn,
typename _Value>
1471 optional(_Optional_func<_Fn> __f, _Value&& __v)
1478#if __cpp_lib_optional >= 202506L
1479#ifdef __cpp_lib_optional_range_support
1480 template<
typename _Tp>
1482 optional<_Tp&>::begin() const noexcept
1483 requires is_object_v<_Tp> && (!is_unbounded_array_v<_Tp>)
1484 {
return __gnu_cxx::__normal_iterator<_Tp*, optional>(_M_val); }
1486 template<
typename _Tp>
1488 optional<_Tp&>::end() const noexcept
1489 requires is_object_v<_Tp> && (!is_unbounded_array_v<_Tp>)
1490 {
return begin() + has_value(); }
1493 template<
typename _Tp>
1495 optional<_Tp&>::value()
const
1499 __throw_bad_optional_access();
1502 template<
typename _Tp>
1503 template<
typename _Up>
1504 requires is_object_v<_Tp> && (!is_array_v<_Tp>)
1506 optional<_Tp&>::value_or(_Up&& __u)
const
1508 using _Xp = remove_cv_t<_Tp>;
1509 static_assert(is_convertible_v<_Tp&, _Xp>);
1510 static_assert(is_convertible_v<_Up, _Xp>);
1516 template<
typename _Tp>
1517 template<
typename _Fn>
1519 optional<_Tp&>::and_then(_Fn&& __f)
const
1521 using _Up = remove_cvref_t<invoke_result_t<_Fn, _Tp&>>;
1522 static_assert(__is_optional_v<_Up>,
1523 "the function passed to std::optional<T&>::and_then "
1524 "must return a std::optional");
1531 template<
typename _Tp>
1532 template<
typename _Fn>
1533 constexpr optional<remove_cv_t<invoke_result_t<_Fn, _Tp&>>>
1534 optional<_Tp&>::transform(_Fn&& __f)
const
1536 using _Up = remove_cv_t<invoke_result_t<_Fn, _Tp&>>;
1538 return optional<_Up>(_Optional_func<_Fn>{__f}, *_M_val);
1540 return optional<_Up>();
1543 template<
typename _Tp>
1544 template<
typename _Fn>
1545 requires is_invocable_v<_Fn>
1546 constexpr optional<_Tp&>
1547 optional<_Tp&>::or_else(_Fn&& __f)
const
1549 static_assert(is_same_v<remove_cvref_t<invoke_result_t<_Fn>>, optional>,
1550 "the function passed to std::optional<T&>::or_else "
1551 "must return a std::optional<T&>");
1560 template<
typename _Tp>
1561 template<
typename _Fn,
typename _Value>
1563 optional<_Tp&>::optional(_Optional_func<_Fn> __f, _Value&& __v)
1570 template<
typename _Tp>
1571 using __optional_relop_t =
1574 template<
typename _Tp,
typename _Up>
1575 using __optional_eq_t = __optional_relop_t<
1579 template<
typename _Tp,
typename _Up>
1580 using __optional_ne_t = __optional_relop_t<
1584 template<
typename _Tp,
typename _Up>
1585 using __optional_lt_t = __optional_relop_t<
1589 template<
typename _Tp,
typename _Up>
1590 using __optional_gt_t = __optional_relop_t<
1594 template<
typename _Tp,
typename _Up>
1595 using __optional_le_t = __optional_relop_t<
1599 template<
typename _Tp,
typename _Up>
1600 using __optional_ge_t = __optional_relop_t<
1605 template<
typename _Tp,
typename _Up>
1607 operator==(
const optional<_Tp>& __lhs,
const optional<_Up>& __rhs)
1608 -> __optional_eq_t<_Tp, _Up>
1610 if (__lhs.has_value() != __rhs.has_value())
1612 if (!__lhs.has_value())
1614 return *__lhs == *__rhs;
1617 template<
typename _Tp,
typename _Up>
1619 operator!=(
const optional<_Tp>& __lhs,
const optional<_Up>& __rhs)
1620 -> __optional_ne_t<_Tp, _Up>
1622 if (__lhs.has_value() != __rhs.has_value())
1624 if (!__lhs.has_value())
1626 return *__lhs != *__rhs;
1629 template<
typename _Tp,
typename _Up>
1631 operator<(
const optional<_Tp>& __lhs,
const optional<_Up>& __rhs)
1632 -> __optional_lt_t<_Tp, _Up>
1634 if (!__rhs.has_value())
1636 if (!__lhs.has_value())
1638 return *__lhs < *__rhs;
1641 template<
typename _Tp,
typename _Up>
1643 operator>(
const optional<_Tp>& __lhs,
const optional<_Up>& __rhs)
1644 -> __optional_gt_t<_Tp, _Up>
1646 if (!__lhs.has_value())
1648 if (!__rhs.has_value())
1650 return *__lhs > *__rhs;
1653 template<
typename _Tp,
typename _Up>
1655 operator<=(
const optional<_Tp>& __lhs,
const optional<_Up>& __rhs)
1656 -> __optional_le_t<_Tp, _Up>
1658 if (!__lhs.has_value())
1660 if (!__rhs.has_value())
1662 return *__lhs <= *__rhs;
1665 template<
typename _Tp,
typename _Up>
1667 operator>=(
const optional<_Tp>& __lhs,
const optional<_Up>& __rhs)
1668 -> __optional_ge_t<_Tp, _Up>
1670 if (!__rhs.has_value())
1672 if (!__lhs.has_value())
1674 return *__lhs >= *__rhs;
1677#ifdef __cpp_lib_three_way_comparison
1678 template<
typename _Tp, three_way_comparable_with<_Tp> _Up>
1681 operator<=>(
const optional<_Tp>& __x,
const optional<_Up>& __y)
1683 return __x && __y ? *__x <=> *__y : bool(__x) <=> bool(__y);
1688 template<
typename _Tp>
1691 operator==(
const optional<_Tp>& __lhs, nullopt_t)
noexcept
1694#ifdef __cpp_lib_three_way_comparison
1695 template<
typename _Tp>
1697 constexpr strong_ordering
1698 operator<=>(
const optional<_Tp>& __x, nullopt_t)
noexcept
1699 {
return bool(__x) <=>
false; }
1701 template<
typename _Tp>
1703 operator==(nullopt_t,
const optional<_Tp>& __rhs)
noexcept
1706 template<
typename _Tp>
1708 operator!=(
const optional<_Tp>& __lhs, nullopt_t)
noexcept
1709 {
return static_cast<bool>(__lhs); }
1711 template<
typename _Tp>
1713 operator!=(nullopt_t,
const optional<_Tp>& __rhs)
noexcept
1714 {
return static_cast<bool>(__rhs); }
1716 template<
typename _Tp>
1718 operator<(
const optional<_Tp>& , nullopt_t)
noexcept
1721 template<
typename _Tp>
1723 operator<(nullopt_t,
const optional<_Tp>& __rhs)
noexcept
1724 {
return static_cast<bool>(__rhs); }
1726 template<
typename _Tp>
1728 operator>(
const optional<_Tp>& __lhs, nullopt_t)
noexcept
1729 {
return static_cast<bool>(__lhs); }
1731 template<
typename _Tp>
1733 operator>(nullopt_t,
const optional<_Tp>& )
noexcept
1736 template<
typename _Tp>
1738 operator<=(
const optional<_Tp>& __lhs, nullopt_t)
noexcept
1741 template<
typename _Tp>
1743 operator<=(nullopt_t,
const optional<_Tp>& )
noexcept
1746 template<
typename _Tp>
1748 operator>=(
const optional<_Tp>& , nullopt_t)
noexcept
1751 template<
typename _Tp>
1753 operator>=(nullopt_t,
const optional<_Tp>& __rhs)
noexcept
1757#if __cpp_lib_concepts
1760# define _REQUIRES_NOT_OPTIONAL(T) requires (!__is_optional_v<T>)
1762# define _REQUIRES_NOT_OPTIONAL(T)
1766 template<
typename _Tp,
typename _Up>
1767 _REQUIRES_NOT_OPTIONAL(_Up)
1769 operator== [[nodiscard]] (
const optional<_Tp>& __lhs,
const _Up& __rhs)
1770 -> __optional_eq_t<_Tp, _Up>
1772 if (__lhs.has_value())
1773 return *__lhs == __rhs;
1777 template<
typename _Tp,
typename _Up>
1778 _REQUIRES_NOT_OPTIONAL(_Tp)
1780 operator== [[nodiscard]] (
const _Tp& __lhs,
const optional<_Up>& __rhs)
1781 -> __optional_eq_t<_Tp, _Up>
1783 if (__rhs.has_value())
1784 return __lhs == *__rhs;
1788 template<
typename _Tp,
typename _Up>
1789 _REQUIRES_NOT_OPTIONAL(_Up)
1791 operator!= [[nodiscard]] (
const optional<_Tp>& __lhs,
const _Up& __rhs)
1792 -> __optional_ne_t<_Tp, _Up>
1794 if (__lhs.has_value())
1795 return *__lhs != __rhs;
1799 template<
typename _Tp,
typename _Up>
1800 _REQUIRES_NOT_OPTIONAL(_Tp)
1802 operator!= [[nodiscard]] (
const _Tp& __lhs,
const optional<_Up>& __rhs)
1803 -> __optional_ne_t<_Tp, _Up>
1805 if (__rhs.has_value())
1806 return __lhs != *__rhs;
1810 template<
typename _Tp,
typename _Up>
1811 _REQUIRES_NOT_OPTIONAL(_Up)
1813 operator< [[nodiscard]] (
const optional<_Tp>& __lhs,
const _Up& __rhs)
1814 -> __optional_lt_t<_Tp, _Up>
1816 if (__lhs.has_value())
1817 return *__lhs < __rhs;
1821 template<
typename _Tp,
typename _Up>
1822 _REQUIRES_NOT_OPTIONAL(_Tp)
1824 operator< [[nodiscard]] (
const _Tp& __lhs,
const optional<_Up>& __rhs)
1825 -> __optional_lt_t<_Tp, _Up>
1827 if (__rhs.has_value())
1828 return __lhs < *__rhs;
1832 template<
typename _Tp,
typename _Up>
1833 _REQUIRES_NOT_OPTIONAL(_Up)
1835 operator> [[nodiscard]] (
const optional<_Tp>& __lhs,
const _Up& __rhs)
1836 -> __optional_gt_t<_Tp, _Up>
1838 if (__lhs.has_value())
1839 return *__lhs > __rhs;
1843 template<
typename _Tp,
typename _Up>
1844 _REQUIRES_NOT_OPTIONAL(_Tp)
1846 operator> [[nodiscard]] (
const _Tp& __lhs,
const optional<_Up>& __rhs)
1847 -> __optional_gt_t<_Tp, _Up>
1849 if (__rhs.has_value())
1850 return __lhs > *__rhs;
1854 template<
typename _Tp,
typename _Up>
1855 _REQUIRES_NOT_OPTIONAL(_Up)
1857 operator<= [[nodiscard]] (
const optional<_Tp>& __lhs,
const _Up& __rhs)
1858 -> __optional_le_t<_Tp, _Up>
1860 if (__lhs.has_value())
1861 return *__lhs <= __rhs;
1865 template<
typename _Tp,
typename _Up>
1866 _REQUIRES_NOT_OPTIONAL(_Tp)
1868 operator<= [[nodiscard]] (
const _Tp& __lhs,
const optional<_Up>& __rhs)
1869 -> __optional_le_t<_Tp, _Up>
1871 if (__rhs.has_value())
1872 return __lhs <= *__rhs;
1876 template<
typename _Tp,
typename _Up>
1877 _REQUIRES_NOT_OPTIONAL(_Up)
1879 operator>= [[nodiscard]] (
const optional<_Tp>& __lhs,
const _Up& __rhs)
1880 -> __optional_ge_t<_Tp, _Up>
1882 if (__lhs.has_value())
1883 return *__lhs >= __rhs;
1887 template<
typename _Tp,
typename _Up>
1888 _REQUIRES_NOT_OPTIONAL(_Tp)
1890 operator>= [[nodiscard]] (
const _Tp& __lhs,
const optional<_Up>& __rhs)
1891 -> __optional_ge_t<_Tp, _Up>
1893 if (__rhs.has_value())
1894 return __lhs >= *__rhs;
1898#ifdef __cpp_lib_three_way_comparison
1902 template<
typename _Tp>
1903 concept __is_derived_from_optional =
requires (
const _Tp& __t) {
1904 []<
typename _Up>(
const optional<_Up>&){ }(__t);
1907 template<
typename _Tp,
typename _Up>
1908 requires (!__is_derived_from_optional<_Up>)
1910 && three_way_comparable_with<_Tp, _Up>
1912 operator<=> [[nodiscard]] (
const optional<_Tp>& __x,
const _Up& __v)
1913 {
return bool(__x) ? *__x <=> __v : strong_ordering::less; }
1920 template<
typename _Tp>
1921 _GLIBCXX20_CONSTEXPR
1923 swap(optional<_Tp>& __lhs, optional<_Tp>& __rhs)
1924 noexcept(
noexcept(__lhs.swap(__rhs)))
1925 { __lhs.swap(__rhs); }
1927#if __cpp_lib_optional >= 202506L
1930 template<
typename _Tp>
1932 swap(optional<_Tp&>& __lhs, optional<_Tp&>& __rhs)
noexcept
1933 { __lhs.swap(__rhs); }
1938 template<
typename _Tp>
1939 enable_if_t<!(is_move_constructible_v<_Tp> && is_swappable_v<_Tp>)>
1940 swap(optional<_Tp>&, optional<_Tp>&) =
delete;
1942#if __cpp_lib_optional >= 202506L
1943 template<
int = 0,
typename _Tp>
1945 template<
typename _Tp>
1949 optional<decay_t<_Tp>>>
1950 make_optional(_Tp&& __t)
1951 noexcept(is_nothrow_constructible_v<optional<decay_t<_Tp>>, _Tp>)
1954 template<
typename _Tp,
typename... _Args>
1958 make_optional(_Args&&... __args)
1959 noexcept(is_nothrow_constructible_v<_Tp, _Args...>)
1962 template<
typename _Tp,
typename _Up,
typename... _Args>
1967 noexcept(is_nothrow_constructible_v<_Tp, initializer_list<_Up>&, _Args...>)
1972 template<
typename _Tp,
typename _Up = remove_const_t<_Tp>>
1973 struct __optional_hash
1974#if ! _GLIBCXX_INLINE_VERSION
1975 :
public __hash_empty_base<_Up>
1978#if __cplusplus < 202002L
1979 using result_type [[__deprecated__]] = size_t;
1980 using argument_type [[__deprecated__]] = optional<_Tp>;
1984 operator()(
const optional<_Tp>& __t)
const
1985 noexcept(
noexcept(hash<_Up>{}(*__t)))
1989 constexpr size_t __magic_disengaged_hash =
static_cast<size_t>(-3333);
1990 return __t ? hash<_Up>{}(*__t) : __magic_disengaged_hash;
1994 template<
typename _Tp>
1995 struct hash<optional<_Tp>>
1997 :
public __conditional_t<__is_hash_enabled_for<remove_const_t<_Tp>>,
1998 __optional_hash<_Tp>,
1999 __hash_not_enabled<_Tp>>
2002 template<
typename _Tp>
2008#if __cpp_deduction_guides >= 201606
2009 template <
typename _Tp> optional(_Tp) -> optional<_Tp>;
2012#ifdef __cpp_lib_optional_range_support
2013 template<
typename _Tp>
2014 inline constexpr bool
2017#if __cpp_lib_optional >= 202506L
2018 template<
typename _Tp>
2020 ranges::enable_borrowed_range<optional<_Tp&>> =
true;
2024 template<
typename _Tp>
2025 inline constexpr range_format
2026 format_kind<optional<_Tp>> = range_format::disabled;
2030#undef _GLIBCXX_USE_CONSTRAINTS_FOR_OPTIONAL
2032_GLIBCXX_END_NAMESPACE_VERSION
constexpr bool enable_view
[range.view] The ranges::enable_view boolean.
constexpr complex< _Tp > operator*(const complex< _Tp > &__x, const complex< _Tp > &__y)
Return new complex value x times y.
__bool_constant< true > true_type
The type used as a compile-time boolean with true value.
typename enable_if< _Cond, _Tp >::type enable_if_t
Alias template for enable_if.
typename decay< _Tp >::type decay_t
Alias template for decay.
auto declval() noexcept -> decltype(__declval< _Tp >(0))
constexpr _Tp * addressof(_Tp &__r) noexcept
Returns the actual address of the object or function referenced by r, even in the presence of an over...
constexpr std::remove_reference< _Tp >::type && move(_Tp &&__t) noexcept
Convert a value to an rvalue.
constexpr __invoke_result< _Callable, _Args... >::type __invoke(_Callable &&__fn, _Args &&... __args) noexcept(__is_nothrow_invocable< _Callable, _Args... >::value)
Invoke a callable object.
constexpr _Tp * __addressof(_Tp &__r) noexcept
Same as C++11 std::addressof.
constexpr _Tp && forward(typename std::remove_reference< _Tp >::type &__t) noexcept
Forward an lvalue.
ISO C++ entities toplevel namespace is std.
constexpr auto end(_Container &__cont) noexcept(noexcept(__cont.end())) -> decltype(__cont.end())
Return an iterator pointing to one past the last element of the container.
typename __detail::__cmp3way_res_impl< _Tp, _Up >::type compare_three_way_result_t
[cmp.result], result of three-way comparison
constexpr void _Construct(_Tp *__p, _Args &&... __args)
constexpr auto begin(_Container &__cont) noexcept(noexcept(__cont.begin())) -> decltype(__cont.begin())
Return an iterator pointing to the first element of the container.
Primary class template hash.
Base class for all library exceptions.