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();
306#if defined(__clang__) && __cpp_lib_optional >= 202106L
307 if (std::is_constant_evaluated())
313#if __cplusplus >= 202002L
314 template<
typename _Fn,
typename _Up>
316 _M_apply(_Optional_func<_Fn> __f, _Up&& __x)
330 {
return this->_M_payload._M_value; }
333 _M_get() const noexcept
334 {
return this->_M_payload._M_value; }
340 if (this->_M_engaged)
343 this->_M_engaged =
false;
348 template <
typename _Tp,
350 is_trivially_destructible_v<_Tp>,
352 is_trivially_copy_assignable_v<_Tp>
353 && is_trivially_copy_constructible_v<_Tp>,
355 is_trivially_move_assignable_v<_Tp>
356 && is_trivially_move_constructible_v<_Tp>>
357 struct _Optional_payload;
360 template <
typename _Tp>
361 struct _Optional_payload<_Tp, true, true, true>
362 : _Optional_payload_base<_Tp>
364 using _Optional_payload_base<_Tp>::_Optional_payload_base;
366 _Optional_payload() =
default;
370 template <
typename _Tp>
371 struct _Optional_payload<_Tp, true, false, true>
372 : _Optional_payload_base<_Tp>
374 using _Optional_payload_base<_Tp>::_Optional_payload_base;
376 _Optional_payload() =
default;
377 ~_Optional_payload() =
default;
378 _Optional_payload(
const _Optional_payload&) =
default;
379 _Optional_payload(_Optional_payload&&) =
default;
380 _Optional_payload& operator=(_Optional_payload&&) =
default;
385 operator=(
const _Optional_payload& __other)
387 this->_M_copy_assign(__other);
393 template <
typename _Tp>
394 struct _Optional_payload<_Tp, true, true, false>
395 : _Optional_payload_base<_Tp>
397 using _Optional_payload_base<_Tp>::_Optional_payload_base;
399 _Optional_payload() =
default;
400 ~_Optional_payload() =
default;
401 _Optional_payload(
const _Optional_payload&) =
default;
402 _Optional_payload(_Optional_payload&&) =
default;
403 _Optional_payload& operator=(
const _Optional_payload&) =
default;
408 operator=(_Optional_payload&& __other)
409 noexcept(__and_v<is_nothrow_move_constructible<_Tp>,
410 is_nothrow_move_assignable<_Tp>>)
412 this->_M_move_assign(
std::move(__other));
418 template <
typename _Tp>
419 struct _Optional_payload<_Tp, true, false, false>
420 : _Optional_payload_base<_Tp>
422 using _Optional_payload_base<_Tp>::_Optional_payload_base;
424 _Optional_payload() =
default;
425 ~_Optional_payload() =
default;
426 _Optional_payload(
const _Optional_payload&) =
default;
427 _Optional_payload(_Optional_payload&&) =
default;
432 operator=(
const _Optional_payload& __other)
434 this->_M_copy_assign(__other);
441 operator=(_Optional_payload&& __other)
442 noexcept(__and_v<is_nothrow_move_constructible<_Tp>,
443 is_nothrow_move_assignable<_Tp>>)
445 this->_M_move_assign(
std::move(__other));
451 template <
typename _Tp,
bool _Copy,
bool _Move>
452 struct _Optional_payload<_Tp, false, _Copy, _Move>
453 : _Optional_payload<_Tp, true, false, false>
456 using _Optional_payload<_Tp,
true,
false,
false>::_Optional_payload;
457 _Optional_payload() =
default;
458 _Optional_payload(
const _Optional_payload&) =
default;
459 _Optional_payload(_Optional_payload&&) =
default;
460 _Optional_payload& operator=(
const _Optional_payload&) =
default;
461 _Optional_payload& operator=(_Optional_payload&&) =
default;
464 _GLIBCXX20_CONSTEXPR ~_Optional_payload() { this->_M_reset(); }
485 template<
typename _Tp,
486 bool = is_trivially_copy_constructible_v<_Tp>,
487 bool = is_trivially_move_constructible_v<_Tp>>
488 struct _Optional_base
491 constexpr _Optional_base() =
default;
494 template<
typename... _Args,
495 enable_if_t<is_constructible_v<_Tp, _Args...>,
bool> =
false>
497 _Optional_base(in_place_t, _Args&&... __args)
498 : _M_payload(in_place, std::
forward<_Args>(__args)...)
501 template<
typename _Up,
typename... _Args,
503 initializer_list<_Up>&,
504 _Args...>,
bool> =
false>
506 _Optional_base(in_place_t,
507 initializer_list<_Up> __il,
509 : _M_payload(in_place, __il, std::
forward<_Args>(__args)...)
514 _Optional_base(
const _Optional_base& __other)
515 noexcept(is_nothrow_copy_constructible_v<_Tp>)
516 : _M_payload(__other._M_payload._M_engaged, __other._M_payload)
520 _Optional_base(_Optional_base&& __other)
521 noexcept(is_nothrow_move_constructible_v<_Tp>)
522 : _M_payload(__other._M_payload._M_engaged,
523 std::move(__other._M_payload))
526#if __cpp_concepts >= 202002L
529 constexpr _Optional_base(
const _Optional_base&)
530 requires is_trivially_copy_constructible_v<_Tp> =
default;
532 constexpr _Optional_base(_Optional_base&&)
533 requires is_trivially_move_constructible_v<_Tp> = default;
537 _Optional_base& operator=(
const _Optional_base&) =
default;
538 _Optional_base& operator=(_Optional_base&&) =
default;
540 _Optional_payload<_Tp> _M_payload;
544 using _Stored_type = remove_const_t<_Tp>;
548 template<
typename... _Args>
550 _M_construct(_Args&&... __args)
551 noexcept(is_nothrow_constructible_v<_Stored_type, _Args...>)
557 _M_destruct() noexcept
558 { _M_payload._M_destroy(); }
563 { _M_payload._M_reset(); }
565 constexpr bool _M_is_engaged() const noexcept
566 {
return _M_payload._M_engaged; }
571 {
return _M_payload._M_get(); }
574 _M_get() const noexcept
575 {
return _M_payload._M_get(); }
578#if __cpp_concepts < 202002L
589 template<
typename _Tp,
typename _Dp>
590 class _Optional_base_impl
593 using _Stored_type = remove_const_t<_Tp>;
597 template<
typename... _Args>
599 _M_construct(_Args&&... __args)
600 noexcept(is_nothrow_constructible_v<_Stored_type, _Args...>)
602 static_cast<_Dp*
>(
this)->_M_payload._M_construct(
607 _M_destruct() noexcept
608 {
static_cast<_Dp*
>(
this)->_M_payload._M_destroy(); }
613 {
static_cast<_Dp*
>(
this)->_M_payload._M_reset(); }
615 constexpr bool _M_is_engaged() const noexcept
616 {
return static_cast<const _Dp*
>(
this)->_M_payload._M_engaged; }
621 {
return static_cast<_Dp*
>(
this)->_M_payload._M_get(); }
624 _M_get() const noexcept
625 {
return static_cast<const _Dp*
>(
this)->_M_payload._M_get(); }
628 template<
typename _Tp>
629 struct _Optional_base<_Tp, false, true>
630 : _Optional_base_impl<_Tp, _Optional_base<_Tp>>
633 constexpr _Optional_base() =
default;
636 template<
typename... _Args,
637 enable_if_t<is_constructible_v<_Tp, _Args...>,
bool> =
false>
639 _Optional_base(in_place_t, _Args&&... __args)
640 : _M_payload(in_place, std::
forward<_Args>(__args)...)
643 template<
typename _Up,
typename... _Args,
645 initializer_list<_Up>&,
646 _Args...>,
bool> =
false>
648 _Optional_base(in_place_t,
649 initializer_list<_Up> __il,
651 : _M_payload(in_place, __il, std::
forward<_Args>(__args)...)
655 constexpr _Optional_base(
const _Optional_base& __other)
656 : _M_payload(__other._M_payload._M_engaged, __other._M_payload)
659 constexpr _Optional_base(_Optional_base&& __other) =
default;
662 _Optional_base& operator=(
const _Optional_base&) =
default;
663 _Optional_base& operator=(_Optional_base&&) =
default;
665 _Optional_payload<_Tp> _M_payload;
668 template<
typename _Tp>
669 struct _Optional_base<_Tp, true, false>
670 : _Optional_base_impl<_Tp, _Optional_base<_Tp>>
673 constexpr _Optional_base() =
default;
676 template<
typename... _Args,
677 enable_if_t<is_constructible_v<_Tp, _Args...>,
bool> =
false>
679 _Optional_base(in_place_t, _Args&&... __args)
680 : _M_payload(in_place, std::
forward<_Args>(__args)...)
683 template<
typename _Up,
typename... _Args,
686 _Args...>,
bool> =
false>
688 _Optional_base(in_place_t,
691 : _M_payload(in_place, __il, std::
forward<_Args>(__args)...)
695 constexpr _Optional_base(
const _Optional_base& __other) =
default;
698 _Optional_base(_Optional_base&& __other)
699 noexcept(is_nothrow_move_constructible_v<_Tp>)
700 : _M_payload(__other._M_payload._M_engaged,
701 std::
move(__other._M_payload))
705 _Optional_base& operator=(
const _Optional_base&) =
default;
706 _Optional_base& operator=(_Optional_base&&) =
default;
708 _Optional_payload<_Tp> _M_payload;
711 template<
typename _Tp>
712 struct _Optional_base<_Tp, true, true>
713 : _Optional_base_impl<_Tp, _Optional_base<_Tp>>
716 constexpr _Optional_base() =
default;
719 template<
typename... _Args,
720 enable_if_t<is_constructible_v<_Tp, _Args...>,
bool> =
false>
722 _Optional_base(in_place_t, _Args&&... __args)
723 : _M_payload(in_place, std::
forward<_Args>(__args)...)
726 template<
typename _Up,
typename... _Args,
729 _Args...>,
bool> =
false>
731 _Optional_base(in_place_t,
734 : _M_payload(in_place, __il, std::
forward<_Args>(__args)...)
738 constexpr _Optional_base(
const _Optional_base& __other) =
default;
739 constexpr _Optional_base(_Optional_base&& __other) =
default;
742 _Optional_base& operator=(
const _Optional_base&) =
default;
743 _Optional_base& operator=(_Optional_base&&) =
default;
745 _Optional_payload<_Tp> _M_payload;
749 template<
typename _Tp>
750 inline constexpr bool __is_optional_v =
false;
751 template<
typename _Tp>
752 inline constexpr bool __is_optional_v<optional<_Tp>> =
true;
754 template<
typename _Tp,
typename _Wp>
755 using __converts_from_any_cvref = __or_<
762 template<
typename _Tp,
typename _Up>
763 using __converts_from_optional
764 = __converts_from_any_cvref<_Tp, optional<_Up>>;
766 template<
typename _Tp,
typename _Up>
767 using __assigns_from_optional =
768 __or_<is_assignable<_Tp&, const optional<_Up>&>,
773#if __cpp_concepts && __cpp_conditional_explicit && __glibcxx_remove_cvref
774# define _GLIBCXX_USE_CONSTRAINTS_FOR_OPTIONAL 1
780 template<
typename _Tp>
782 :
private _Optional_base<_Tp>,
783 private _Enable_copy_move<
785 is_copy_constructible_v<_Tp>,
787 __and_v<is_copy_constructible<_Tp>, is_copy_assignable<_Tp>>,
789 is_move_constructible_v<_Tp>,
791 __and_v<is_move_constructible<_Tp>, is_move_assignable<_Tp>>,
795 static_assert(__is_valid_contained_type_for_optional<_Tp>);
798 using _Base = _Optional_base<_Tp>;
806#ifdef _GLIBCXX_USE_CONSTRAINTS_FOR_OPTIONAL
807 template<
typename _From,
typename = remove_cv_t<_Tp>>
808 static constexpr bool __not_constructing_bool_from_optional
813 template<
typename _From>
814 static constexpr bool
815 __not_constructing_bool_from_optional<_From, bool>
816 = !__is_optional_v<remove_cvref_t<_From>>;
822 template<
typename _From,
typename = remove_cv_t<_Tp>>
823 static constexpr bool __construct_from_contained_value
824 = !__converts_from_optional<_Tp, _From>::value;
828 template<
typename _From>
829 static constexpr bool __construct_from_contained_value<_From, bool>
832 template<
typename _From,
typename = remove_cv_t<_Tp>>
833 struct __not_constructing_bool_from_optional
837 template<
typename _From>
838 struct __not_constructing_bool_from_optional<_From, bool>
839 : bool_constant<!__is_optional_v<__remove_cvref_t<_From>>>
842 template<
typename _From,
typename = remove_cv_t<_Tp>>
843 struct __construct_from_contained_value
844 : __not_<__converts_from_optional<_Tp, _From>>
847 template<
typename _From>
848 struct __construct_from_contained_value<_From, bool>
852 template<
typename _Up>
853 using __not_self = __not_<is_same<optional, __remove_cvref_t<_Up>>>;
854 template<
typename _Up>
855 using __not_tag = __not_<is_same<in_place_t, __remove_cvref_t<_Up>>>;
856 template<
typename... _Cond>
857 using _Requires =
enable_if_t<__and_v<_Cond...>,
bool>;
861 using value_type = _Tp;
862#ifdef __cpp_lib_optional_range_support
863 using iterator = __gnu_cxx::__normal_iterator<_Tp*, optional>;
864 using const_iterator = __gnu_cxx::__normal_iterator<const _Tp*, optional>;
867 constexpr optional() noexcept { }
869 constexpr optional(nullopt_t)
noexcept { }
872#ifdef _GLIBCXX_USE_CONSTRAINTS_FOR_OPTIONAL
873 template<
typename _Up = remove_cv_t<_Tp>>
874 requires (!is_same_v<optional, remove_cvref_t<_Up>>)
875 && (!is_same_v<in_place_t, remove_cvref_t<_Up>>)
876 && is_constructible_v<_Tp, _Up>
877 && __not_constructing_bool_from_optional<_Up>
878 constexpr explicit(!is_convertible_v<_Up, _Tp>)
880 noexcept(is_nothrow_constructible_v<_Tp, _Up>)
881 : _Base(std::in_place, std::
forward<_Up>(__t)) { }
883 template<
typename _Up>
884 requires (!is_same_v<_Tp, _Up>)
885 && is_constructible_v<_Tp, const _Up&>
886 && __construct_from_contained_value<_Up>
887 constexpr explicit(!is_convertible_v<const _Up&, _Tp>)
888 optional(
const optional<_Up>& __t)
889 noexcept(is_nothrow_constructible_v<_Tp, const _Up&>)
892 emplace(__t._M_fwd());
895 template<
typename _Up>
896 requires (!is_same_v<_Tp, _Up>)
897 && is_constructible_v<_Tp, _Up>
898 && __construct_from_contained_value<_Up>
899 constexpr explicit(!is_convertible_v<_Up, _Tp>)
900 optional(optional<_Up>&& __t)
901 noexcept(is_nothrow_constructible_v<_Tp, _Up>)
907 template<
typename... _Args>
908 requires is_constructible_v<_Tp, _Args...>
910 optional(in_place_t, _Args&&... __args)
911 noexcept(is_nothrow_constructible_v<_Tp, _Args...>)
912 : _Base(std::in_place, std::
forward<_Args>(__args)...)
915 template<
typename _Up,
typename... _Args>
916 requires is_constructible_v<_Tp, initializer_list<_Up>&, _Args...>
918 optional(in_place_t, initializer_list<_Up> __il, _Args&&... __args)
919 noexcept(is_nothrow_constructible_v<_Tp, initializer_list<_Up>&,
921 : _Base(std::in_place, __il, std::
forward<_Args>(__args)...)
924 template<
typename _Up = remove_cv_t<_Tp>,
925 _Requires<__not_self<_Up>, __not_tag<_Up>,
926 is_constructible<_Tp, _Up>,
927 is_convertible<_Up, _Tp>,
928 __not_constructing_
bool_from_optional<_Up>> = true>
931 noexcept(is_nothrow_constructible_v<_Tp, _Up>)
932 : _Base(std::in_place, std::
forward<_Up>(__t)) { }
934 template<
typename _Up = remove_cv_t<_Tp>,
935 _Requires<__not_self<_Up>, __not_tag<_Up>,
936 is_constructible<_Tp, _Up>,
937 __not_<is_convertible<_Up, _Tp>>,
938 __not_constructing_
bool_from_optional<_Up>> = false>
941 noexcept(is_nothrow_constructible_v<_Tp, _Up>)
942 : _Base(std::in_place, std::
forward<_Up>(__t)) { }
944 template<
typename _Up,
945 _Requires<__not_<is_same<_Tp, _Up>>,
946 is_constructible<_Tp, const _Up&>,
947 is_convertible<const _Up&, _Tp>,
948 __construct_from_contained_value<_Up>> =
true>
950 optional(
const optional<_Up>& __t)
951 noexcept(is_nothrow_constructible_v<_Tp, const _Up&>)
954 emplace(__t._M_fwd());
957 template<
typename _Up,
958 _Requires<__not_<is_same<_Tp, _Up>>,
959 is_constructible<_Tp, const _Up&>,
960 __not_<is_convertible<const _Up&, _Tp>>,
961 __construct_from_contained_value<_Up>> =
false>
963 optional(
const optional<_Up>& __t)
964 noexcept(is_nothrow_constructible_v<_Tp, const _Up&>)
967 emplace(__t._M_fwd());
970 template<
typename _Up,
971 _Requires<__not_<is_same<_Tp, _Up>>,
972 is_constructible<_Tp, _Up>,
973 is_convertible<_Up, _Tp>,
974 __construct_from_contained_value<_Up>> =
true>
976 optional(optional<_Up>&& __t)
977 noexcept(is_nothrow_constructible_v<_Tp, _Up>)
983 template<
typename _Up,
984 _Requires<__not_<is_same<_Tp, _Up>>,
985 is_constructible<_Tp, _Up>,
986 __not_<is_convertible<_Up, _Tp>>,
987 __construct_from_contained_value<_Up>> =
false>
989 optional(optional<_Up>&& __t)
990 noexcept(is_nothrow_constructible_v<_Tp, _Up>)
996 template<
typename... _Args,
997 _Requires<is_constructible<_Tp, _Args...>> =
false>
999 optional(in_place_t, _Args&&... __args)
1000 noexcept(is_nothrow_constructible_v<_Tp, _Args...>)
1001 : _Base(std::in_place, std::
forward<_Args>(__args)...) { }
1003 template<
typename _Up,
typename... _Args,
1004 _Requires<is_constructible<_Tp,
1005 initializer_list<_Up>&,
1008 optional(in_place_t, initializer_list<_Up> __il, _Args&&... __args)
1009 noexcept(is_nothrow_constructible_v<_Tp, initializer_list<_Up>&,
1011 : _Base(std::in_place, __il, std::
forward<_Args>(__args)...) { }
1015 _GLIBCXX20_CONSTEXPR optional&
1016 operator=(nullopt_t)
noexcept
1022 template<
typename _Up = remove_cv_t<_Tp>>
1023#ifdef _GLIBCXX_USE_CONSTRAINTS_FOR_OPTIONAL
1024 requires (!is_same_v<optional, remove_cvref_t<_Up>>)
1025 && (!(is_scalar_v<_Tp> && is_same_v<_Tp,
decay_t<_Up>>))
1026 && is_constructible_v<_Tp, _Up>
1027 && is_assignable_v<_Tp&, _Up>
1031 __not_<__and_<is_scalar<_Tp>,
1032 is_same<_Tp, decay_t<_Up>>>>,
1033 is_constructible<_Tp, _Up>,
1034 is_assignable<_Tp&, _Up>>,
1037 operator=(_Up&& __u)
1038 noexcept(__and_v<is_nothrow_constructible<_Tp, _Up>,
1039 is_nothrow_assignable<_Tp&, _Up>>)
1041 if (this->_M_is_engaged())
1049 template<
typename _Up>
1050#ifdef _GLIBCXX_USE_CONSTRAINTS_FOR_OPTIONAL
1051 requires (!is_same_v<_Tp, _Up>)
1052 && is_constructible_v<_Tp, const _Up&>
1053 && is_assignable_v<_Tp&, const _Up&>
1054 && (!__converts_from_optional<_Tp, _Up>::value)
1055 && (!__assigns_from_optional<_Tp, _Up>::value)
1059 is_constructible<_Tp, const _Up&>,
1060 is_assignable<_Tp&, const _Up&>,
1061 __not_<__converts_from_optional<_Tp, _Up>>,
1062 __not_<__assigns_from_optional<_Tp, _Up>>>,
1065 operator=(
const optional<_Up>& __u)
1066 noexcept(__and_v<is_nothrow_constructible<_Tp, const _Up&>,
1067 is_nothrow_assignable<_Tp&, const _Up&>>)
1071 if (this->_M_is_engaged())
1072 this->_M_get() = __u._M_fwd();
1074 this->_M_construct(__u._M_fwd());
1083 template<
typename _Up>
1084#ifdef _GLIBCXX_USE_CONSTRAINTS_FOR_OPTIONAL
1085 requires (!is_same_v<_Tp, _Up>)
1086 && is_constructible_v<_Tp, _Up>
1087 && is_assignable_v<_Tp&, _Up>
1088 && (!__converts_from_optional<_Tp, _Up>::value)
1089 && (!__assigns_from_optional<_Tp, _Up>::value)
1093 is_constructible<_Tp, _Up>,
1094 is_assignable<_Tp&, _Up>,
1095 __not_<__converts_from_optional<_Tp, _Up>>,
1096 __not_<__assigns_from_optional<_Tp, _Up>>>,
1099 operator=(optional<_Up>&& __u)
1100 noexcept(__and_v<is_nothrow_constructible<_Tp, _Up>,
1101 is_nothrow_assignable<_Tp&, _Up>>)
1105 if (this->_M_is_engaged())
1106 this->_M_get() =
std::move(__u)._M_fwd();
1108 this->_M_construct(
std::move(__u)._M_fwd());
1120 template<
typename... _Args>
1121 _GLIBCXX20_CONSTEXPR
1122 enable_if_t<is_constructible_v<_Tp, _Args...>, _Tp&>
1123 emplace(_Args&&... __args)
1124 noexcept(is_nothrow_constructible_v<_Tp, _Args...>)
1128 return this->_M_get();
1131 template<
typename _Up,
typename... _Args>
1132 _GLIBCXX20_CONSTEXPR
1135 emplace(initializer_list<_Up> __il, _Args&&... __args)
1136 noexcept(is_nothrow_constructible_v<_Tp, initializer_list<_Up>&,
1141 return this->_M_get();
1147 _GLIBCXX20_CONSTEXPR
void
1148 swap(optional& __other)
1149 noexcept(is_nothrow_move_constructible_v<_Tp>
1150 && is_nothrow_swappable_v<_Tp>)
1154 if (this->_M_is_engaged() && __other._M_is_engaged())
1155 swap(this->_M_get(), __other._M_get());
1156 else if (this->_M_is_engaged())
1158 __other._M_construct(
std::move(this->_M_get()));
1159 this->_M_destruct();
1161 else if (__other._M_is_engaged())
1163 this->_M_construct(
std::move(__other._M_get()));
1164 __other._M_destruct();
1168#ifdef __cpp_lib_optional_range_support
1170 constexpr iterator
begin() noexcept
1177 constexpr const_iterator
begin() const noexcept
1179 return const_iterator(
1184 constexpr iterator
end() noexcept
1186 return begin() + has_value();
1189 constexpr const_iterator
end() const noexcept
1191 return begin() + has_value();
1196 constexpr const _Tp*
1197 operator->() const noexcept
1199 __glibcxx_assert(this->_M_is_engaged());
1204 operator->() noexcept
1206 __glibcxx_assert(this->_M_is_engaged());
1210 constexpr const _Tp&
1213 __glibcxx_assert(this->_M_is_engaged());
1214 return this->_M_get();
1220 __glibcxx_assert(this->_M_is_engaged());
1221 return this->_M_get();
1227 __glibcxx_assert(this->_M_is_engaged());
1231 constexpr const _Tp&&
1234 __glibcxx_assert(this->_M_is_engaged());
1238 constexpr explicit operator bool() const noexcept
1239 {
return this->_M_is_engaged(); }
1241 constexpr bool has_value() const noexcept
1242 {
return this->_M_is_engaged(); }
1244 constexpr const _Tp&
1247 if (this->_M_is_engaged())
1248 return this->_M_get();
1249 __throw_bad_optional_access();
1255 if (this->_M_is_engaged())
1256 return this->_M_get();
1257 __throw_bad_optional_access();
1263 if (this->_M_is_engaged())
1265 __throw_bad_optional_access();
1268 constexpr const _Tp&&
1271 if (this->_M_is_engaged())
1273 __throw_bad_optional_access();
1278 template<
typename _Up = remove_cv_t<_Tp>>
1279 constexpr remove_cv_t<_Tp>
1280 value_or(_Up&& __u)
const&
1282 using _Xp = remove_cv_t<_Tp>;
1283 static_assert(is_convertible_v<const _Tp&, _Xp>);
1284 static_assert(is_convertible_v<_Up, _Xp>);
1286 if (this->_M_is_engaged())
1287 return this->_M_get();
1291 template<
typename _Up = remove_cv_t<_Tp>>
1292 constexpr remove_cv_t<_Tp>
1293 value_or(_Up&& __u) &&
1295 using _Xp = remove_cv_t<_Tp>;
1296 static_assert(is_convertible_v<_Tp, _Xp>);
1297 static_assert(is_convertible_v<_Up, _Xp>);
1299 if (this->_M_is_engaged())
1304#if __cpp_lib_optional >= 202110L
1307 template<
typename _Fn>
1309 and_then(_Fn&& __f) &
1311 using _Up = remove_cvref_t<invoke_result_t<_Fn, _Tp&>>;
1312 static_assert(__is_optional_v<_Up>,
1313 "the function passed to std::optional<T>::and_then "
1314 "must return a std::optional");
1321 template<
typename _Fn>
1323 and_then(_Fn&& __f)
const &
1325 using _Up = remove_cvref_t<invoke_result_t<_Fn, const _Tp&>>;
1326 static_assert(__is_optional_v<_Up>,
1327 "the function passed to std::optional<T>::and_then "
1328 "must return a std::optional");
1335 template<
typename _Fn>
1337 and_then(_Fn&& __f) &&
1339 using _Up = remove_cvref_t<invoke_result_t<_Fn, _Tp>>;
1340 static_assert(__is_optional_v<_Up>,
1341 "the function passed to std::optional<T>::and_then "
1342 "must return a std::optional");
1349 template<
typename _Fn>
1351 and_then(_Fn&& __f)
const &&
1353 using _Up = remove_cvref_t<invoke_result_t<_Fn, const _Tp>>;
1354 static_assert(__is_optional_v<_Up>,
1355 "the function passed to std::optional<T>::and_then "
1356 "must return a std::optional");
1363 template<
typename _Fn>
1365 transform(_Fn&& __f) &
1367 using _Up = remove_cv_t<invoke_result_t<_Fn, _Tp&>>;
1369 return optional<_Up>(_Optional_func<_Fn>{__f}, _M_get());
1371 return optional<_Up>();
1374 template<
typename _Fn>
1376 transform(_Fn&& __f)
const &
1378 using _Up = remove_cv_t<invoke_result_t<_Fn, const _Tp&>>;
1380 return optional<_Up>(_Optional_func<_Fn>{__f}, _M_get());
1382 return optional<_Up>();
1385 template<
typename _Fn>
1387 transform(_Fn&& __f) &&
1389 using _Up = remove_cv_t<invoke_result_t<_Fn, _Tp>>;
1391 return optional<_Up>(_Optional_func<_Fn>{__f},
std::move(_M_get()));
1393 return optional<_Up>();
1396 template<
typename _Fn>
1398 transform(_Fn&& __f)
const &&
1400 using _Up = remove_cv_t<invoke_result_t<_Fn, const _Tp>>;
1402 return optional<_Up>(_Optional_func<_Fn>{__f},
std::move(_M_get()));
1404 return optional<_Up>();
1407 template<
typename _Fn>
requires invocable<_Fn> && copy_constructible<_Tp>
1409 or_else(_Fn&& __f)
const&
1411 using _Up = invoke_result_t<_Fn>;
1412 static_assert(is_same_v<remove_cvref_t<_Up>, optional>,
1413 "the function passed to std::optional<T>::or_else "
1414 "must return a std::optional<T>");
1422 template<
typename _Fn>
requires invocable<_Fn> && move_constructible<_Tp>
1424 or_else(_Fn&& __f) &&
1426 using _Up = invoke_result_t<_Fn>;
1427 static_assert(is_same_v<remove_cvref_t<_Up>, optional>,
1428 "the function passed to std::optional<T>::or_else "
1429 "must return a std::optional<T>");
1438 _GLIBCXX20_CONSTEXPR
void reset() noexcept { this->_M_reset(); }
1441 using _Base::_M_get;
1443 [[__gnu__::__always_inline__]]
1446 {
return _M_get(); }
1448 [[__gnu__::__always_inline__]]
1450 _M_fwd() &&
noexcept
1453 [[__gnu__::__always_inline__]]
1454 constexpr const _Tp&
1455 _M_fwd() const& noexcept
1456 {
return _M_get(); }
1458 [[__gnu__::__always_inline__]]
1459 constexpr const _Tp&&
1460 _M_fwd() const&& noexcept
1463 template<
typename _Up>
friend class optional;
1465#if __cpp_lib_optional >= 202110L
1466 template<
typename _Fn,
typename _Value>
1468 optional(_Optional_func<_Fn> __f, _Value&& __v)
1475#if __cpp_lib_optional >= 202506L
1476#ifdef __cpp_lib_optional_range_support
1477 template<
typename _Tp>
1479 optional<_Tp&>::begin() const noexcept
1480 requires is_object_v<_Tp> && (!is_unbounded_array_v<_Tp>)
1481 {
return __gnu_cxx::__normal_iterator<_Tp*, optional>(_M_val); }
1483 template<
typename _Tp>
1485 optional<_Tp&>::end() const noexcept
1486 requires is_object_v<_Tp> && (!is_unbounded_array_v<_Tp>)
1487 {
return begin() + has_value(); }
1490 template<
typename _Tp>
1492 optional<_Tp&>::value()
const
1496 __throw_bad_optional_access();
1499 template<
typename _Tp>
1500 template<
typename _Up>
1501 requires is_object_v<_Tp> && (!is_array_v<_Tp>)
1503 optional<_Tp&>::value_or(_Up&& __u)
const
1505 using _Xp = remove_cv_t<_Tp>;
1506 static_assert(is_convertible_v<_Tp&, _Xp>);
1507 static_assert(is_convertible_v<_Up, _Xp>);
1513 template<
typename _Tp>
1514 template<
typename _Fn>
1516 optional<_Tp&>::and_then(_Fn&& __f)
const
1518 using _Up = remove_cvref_t<invoke_result_t<_Fn, _Tp&>>;
1519 static_assert(__is_optional_v<_Up>,
1520 "the function passed to std::optional<T&>::and_then "
1521 "must return a std::optional");
1528 template<
typename _Tp>
1529 template<
typename _Fn>
1530 constexpr optional<remove_cv_t<invoke_result_t<_Fn, _Tp&>>>
1531 optional<_Tp&>::transform(_Fn&& __f)
const
1533 using _Up = remove_cv_t<invoke_result_t<_Fn, _Tp&>>;
1535 return optional<_Up>(_Optional_func<_Fn>{__f}, *_M_val);
1537 return optional<_Up>();
1540 template<
typename _Tp>
1541 template<
typename _Fn>
1542 requires is_invocable_v<_Fn>
1543 constexpr optional<_Tp&>
1544 optional<_Tp&>::or_else(_Fn&& __f)
const
1546 static_assert(is_same_v<remove_cvref_t<invoke_result_t<_Fn>>, optional>,
1547 "the function passed to std::optional<T&>::or_else "
1548 "must return a std::optional<T&>");
1557 template<
typename _Tp>
1558 template<
typename _Fn,
typename _Value>
1560 optional<_Tp&>::optional(_Optional_func<_Fn> __f, _Value&& __v)
1567 template<
typename _Tp>
1568 using __optional_relop_t =
1571 template<
typename _Tp,
typename _Up>
1572 using __optional_eq_t = __optional_relop_t<
1576 template<
typename _Tp,
typename _Up>
1577 using __optional_ne_t = __optional_relop_t<
1581 template<
typename _Tp,
typename _Up>
1582 using __optional_lt_t = __optional_relop_t<
1586 template<
typename _Tp,
typename _Up>
1587 using __optional_gt_t = __optional_relop_t<
1591 template<
typename _Tp,
typename _Up>
1592 using __optional_le_t = __optional_relop_t<
1596 template<
typename _Tp,
typename _Up>
1597 using __optional_ge_t = __optional_relop_t<
1602 template<
typename _Tp,
typename _Up>
1604 operator==(
const optional<_Tp>& __lhs,
const optional<_Up>& __rhs)
1605 -> __optional_eq_t<_Tp, _Up>
1607 if (__lhs.has_value() != __rhs.has_value())
1609 if (!__lhs.has_value())
1611 return *__lhs == *__rhs;
1614 template<
typename _Tp,
typename _Up>
1616 operator!=(
const optional<_Tp>& __lhs,
const optional<_Up>& __rhs)
1617 -> __optional_ne_t<_Tp, _Up>
1619 if (__lhs.has_value() != __rhs.has_value())
1621 if (!__lhs.has_value())
1623 return *__lhs != *__rhs;
1626 template<
typename _Tp,
typename _Up>
1628 operator<(
const optional<_Tp>& __lhs,
const optional<_Up>& __rhs)
1629 -> __optional_lt_t<_Tp, _Up>
1631 if (!__rhs.has_value())
1633 if (!__lhs.has_value())
1635 return *__lhs < *__rhs;
1638 template<
typename _Tp,
typename _Up>
1640 operator>(
const optional<_Tp>& __lhs,
const optional<_Up>& __rhs)
1641 -> __optional_gt_t<_Tp, _Up>
1643 if (!__lhs.has_value())
1645 if (!__rhs.has_value())
1647 return *__lhs > *__rhs;
1650 template<
typename _Tp,
typename _Up>
1652 operator<=(
const optional<_Tp>& __lhs,
const optional<_Up>& __rhs)
1653 -> __optional_le_t<_Tp, _Up>
1655 if (!__lhs.has_value())
1657 if (!__rhs.has_value())
1659 return *__lhs <= *__rhs;
1662 template<
typename _Tp,
typename _Up>
1664 operator>=(
const optional<_Tp>& __lhs,
const optional<_Up>& __rhs)
1665 -> __optional_ge_t<_Tp, _Up>
1667 if (!__rhs.has_value())
1669 if (!__lhs.has_value())
1671 return *__lhs >= *__rhs;
1674#ifdef __cpp_lib_three_way_comparison
1675 template<
typename _Tp, three_way_comparable_with<_Tp> _Up>
1678 operator<=>(
const optional<_Tp>& __x,
const optional<_Up>& __y)
1680 return __x && __y ? *__x <=> *__y : bool(__x) <=> bool(__y);
1685 template<
typename _Tp>
1688 operator==(
const optional<_Tp>& __lhs, nullopt_t)
noexcept
1691#ifdef __cpp_lib_three_way_comparison
1692 template<
typename _Tp>
1694 constexpr strong_ordering
1695 operator<=>(
const optional<_Tp>& __x, nullopt_t)
noexcept
1696 {
return bool(__x) <=>
false; }
1698 template<
typename _Tp>
1700 operator==(nullopt_t,
const optional<_Tp>& __rhs)
noexcept
1703 template<
typename _Tp>
1705 operator!=(
const optional<_Tp>& __lhs, nullopt_t)
noexcept
1706 {
return static_cast<bool>(__lhs); }
1708 template<
typename _Tp>
1710 operator!=(nullopt_t,
const optional<_Tp>& __rhs)
noexcept
1711 {
return static_cast<bool>(__rhs); }
1713 template<
typename _Tp>
1715 operator<(
const optional<_Tp>& , nullopt_t)
noexcept
1718 template<
typename _Tp>
1720 operator<(nullopt_t,
const optional<_Tp>& __rhs)
noexcept
1721 {
return static_cast<bool>(__rhs); }
1723 template<
typename _Tp>
1725 operator>(
const optional<_Tp>& __lhs, nullopt_t)
noexcept
1726 {
return static_cast<bool>(__lhs); }
1728 template<
typename _Tp>
1730 operator>(nullopt_t,
const optional<_Tp>& )
noexcept
1733 template<
typename _Tp>
1735 operator<=(
const optional<_Tp>& __lhs, nullopt_t)
noexcept
1738 template<
typename _Tp>
1740 operator<=(nullopt_t,
const optional<_Tp>& )
noexcept
1743 template<
typename _Tp>
1745 operator>=(
const optional<_Tp>& , nullopt_t)
noexcept
1748 template<
typename _Tp>
1750 operator>=(nullopt_t,
const optional<_Tp>& __rhs)
noexcept
1754#if __cpp_lib_concepts
1757# define _REQUIRES_NOT_OPTIONAL(T) requires (!__is_optional_v<T>)
1759# define _REQUIRES_NOT_OPTIONAL(T)
1763 template<
typename _Tp,
typename _Up>
1764 _REQUIRES_NOT_OPTIONAL(_Up)
1766 operator== [[nodiscard]] (
const optional<_Tp>& __lhs,
const _Up& __rhs)
1767 -> __optional_eq_t<_Tp, _Up>
1769 if (__lhs.has_value())
1770 return *__lhs == __rhs;
1774 template<
typename _Tp,
typename _Up>
1775 _REQUIRES_NOT_OPTIONAL(_Tp)
1777 operator== [[nodiscard]] (
const _Tp& __lhs,
const optional<_Up>& __rhs)
1778 -> __optional_eq_t<_Tp, _Up>
1780 if (__rhs.has_value())
1781 return __lhs == *__rhs;
1785 template<
typename _Tp,
typename _Up>
1786 _REQUIRES_NOT_OPTIONAL(_Up)
1788 operator!= [[nodiscard]] (
const optional<_Tp>& __lhs,
const _Up& __rhs)
1789 -> __optional_ne_t<_Tp, _Up>
1791 if (__lhs.has_value())
1792 return *__lhs != __rhs;
1796 template<
typename _Tp,
typename _Up>
1797 _REQUIRES_NOT_OPTIONAL(_Tp)
1799 operator!= [[nodiscard]] (
const _Tp& __lhs,
const optional<_Up>& __rhs)
1800 -> __optional_ne_t<_Tp, _Up>
1802 if (__rhs.has_value())
1803 return __lhs != *__rhs;
1807 template<
typename _Tp,
typename _Up>
1808 _REQUIRES_NOT_OPTIONAL(_Up)
1810 operator< [[nodiscard]] (
const optional<_Tp>& __lhs,
const _Up& __rhs)
1811 -> __optional_lt_t<_Tp, _Up>
1813 if (__lhs.has_value())
1814 return *__lhs < __rhs;
1818 template<
typename _Tp,
typename _Up>
1819 _REQUIRES_NOT_OPTIONAL(_Tp)
1821 operator< [[nodiscard]] (
const _Tp& __lhs,
const optional<_Up>& __rhs)
1822 -> __optional_lt_t<_Tp, _Up>
1824 if (__rhs.has_value())
1825 return __lhs < *__rhs;
1829 template<
typename _Tp,
typename _Up>
1830 _REQUIRES_NOT_OPTIONAL(_Up)
1832 operator> [[nodiscard]] (
const optional<_Tp>& __lhs,
const _Up& __rhs)
1833 -> __optional_gt_t<_Tp, _Up>
1835 if (__lhs.has_value())
1836 return *__lhs > __rhs;
1840 template<
typename _Tp,
typename _Up>
1841 _REQUIRES_NOT_OPTIONAL(_Tp)
1843 operator> [[nodiscard]] (
const _Tp& __lhs,
const optional<_Up>& __rhs)
1844 -> __optional_gt_t<_Tp, _Up>
1846 if (__rhs.has_value())
1847 return __lhs > *__rhs;
1851 template<
typename _Tp,
typename _Up>
1852 _REQUIRES_NOT_OPTIONAL(_Up)
1854 operator<= [[nodiscard]] (
const optional<_Tp>& __lhs,
const _Up& __rhs)
1855 -> __optional_le_t<_Tp, _Up>
1857 if (__lhs.has_value())
1858 return *__lhs <= __rhs;
1862 template<
typename _Tp,
typename _Up>
1863 _REQUIRES_NOT_OPTIONAL(_Tp)
1865 operator<= [[nodiscard]] (
const _Tp& __lhs,
const optional<_Up>& __rhs)
1866 -> __optional_le_t<_Tp, _Up>
1868 if (__rhs.has_value())
1869 return __lhs <= *__rhs;
1873 template<
typename _Tp,
typename _Up>
1874 _REQUIRES_NOT_OPTIONAL(_Up)
1876 operator>= [[nodiscard]] (
const optional<_Tp>& __lhs,
const _Up& __rhs)
1877 -> __optional_ge_t<_Tp, _Up>
1879 if (__lhs.has_value())
1880 return *__lhs >= __rhs;
1884 template<
typename _Tp,
typename _Up>
1885 _REQUIRES_NOT_OPTIONAL(_Tp)
1887 operator>= [[nodiscard]] (
const _Tp& __lhs,
const optional<_Up>& __rhs)
1888 -> __optional_ge_t<_Tp, _Up>
1890 if (__rhs.has_value())
1891 return __lhs >= *__rhs;
1895#ifdef __cpp_lib_three_way_comparison
1899 template<
typename _Tp>
1900 concept __is_derived_from_optional =
requires (
const _Tp& __t) {
1901 []<
typename _Up>(
const optional<_Up>&){ }(__t);
1904 template<
typename _Tp,
typename _Up>
1905 requires (!__is_derived_from_optional<_Up>)
1907 && three_way_comparable_with<_Tp, _Up>
1909 operator<=> [[nodiscard]] (
const optional<_Tp>& __x,
const _Up& __v)
1910 {
return bool(__x) ? *__x <=> __v : strong_ordering::less; }
1917 template<
typename _Tp>
1918 _GLIBCXX20_CONSTEXPR
1920 swap(optional<_Tp>& __lhs, optional<_Tp>& __rhs)
1921 noexcept(
noexcept(__lhs.swap(__rhs)))
1922 { __lhs.swap(__rhs); }
1924#if __cpp_lib_optional >= 202506L
1927 template<
typename _Tp>
1929 swap(optional<_Tp&>& __lhs, optional<_Tp&>& __rhs)
noexcept
1930 { __lhs.swap(__rhs); }
1935 template<
typename _Tp>
1936 enable_if_t<!(is_move_constructible_v<_Tp> && is_swappable_v<_Tp>)>
1937 swap(optional<_Tp>&, optional<_Tp>&) =
delete;
1939#if __cpp_lib_optional >= 202506L
1940 template<
int = 0,
typename _Tp>
1942 template<
typename _Tp>
1946 optional<decay_t<_Tp>>>
1947 make_optional(_Tp&& __t)
1948 noexcept(is_nothrow_constructible_v<optional<decay_t<_Tp>>, _Tp>)
1951 template<
typename _Tp,
typename... _Args>
1955 make_optional(_Args&&... __args)
1956 noexcept(is_nothrow_constructible_v<_Tp, _Args...>)
1959 template<
typename _Tp,
typename _Up,
typename... _Args>
1964 noexcept(is_nothrow_constructible_v<_Tp, initializer_list<_Up>&, _Args...>)
1969 template<
typename _Tp,
typename _Up = remove_const_t<_Tp>>
1970 struct __optional_hash
1971#if ! _GLIBCXX_INLINE_VERSION
1972 :
public __hash_empty_base<_Up>
1975#if __cplusplus < 202002L
1976 using result_type [[__deprecated__]] = size_t;
1977 using argument_type [[__deprecated__]] = optional<_Tp>;
1981 operator()(
const optional<_Tp>& __t)
const
1982 noexcept(
noexcept(hash<_Up>{}(*__t)))
1986 constexpr size_t __magic_disengaged_hash =
static_cast<size_t>(-3333);
1987 return __t ? hash<_Up>{}(*__t) : __magic_disengaged_hash;
1991 template<
typename _Tp>
1992 struct hash<optional<_Tp>>
1994 :
public __conditional_t<__is_hash_enabled_for<remove_const_t<_Tp>>,
1995 __optional_hash<_Tp>,
1996 __hash_not_enabled<_Tp>>
1999 template<
typename _Tp>
2005#if __cpp_deduction_guides >= 201606
2006 template <
typename _Tp> optional(_Tp) -> optional<_Tp>;
2009#ifdef __cpp_lib_optional_range_support
2010 template<
typename _Tp>
2011 inline constexpr bool
2014#if __cpp_lib_optional >= 202506L
2015 template<
typename _Tp>
2017 ranges::enable_borrowed_range<optional<_Tp&>> =
true;
2021 template<
typename _Tp>
2022 inline constexpr range_format
2023 format_kind<optional<_Tp>> = range_format::disabled;
2027#undef _GLIBCXX_USE_CONSTRAINTS_FOR_OPTIONAL
2029_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.