64 _GLIBCXX_MOF_REF noexcept(_Noex)>
65 : __polyfunc::_Mo_base
68 (std::__is_complete_or_unbounded(__type_identity<_ArgTypes>()) && ...),
69 "each parameter type must be a complete class");
71 using _Base = __polyfunc::_Mo_base;
72 using _Invoker = __polyfunc::_Invoker<_Noex, _Res, _ArgTypes...>;
74 template<
typename _Tp>
76 = __conditional_t<_Noex,
77 is_nothrow_invocable_r<_Res, _Tp, _ArgTypes...>,
78 is_invocable_r<_Res, _Tp, _ArgTypes...>>;
81 template<
typename _Vt>
82 static constexpr bool __is_callable_from
83 = __and_v<__callable<_Vt _GLIBCXX_MOF_CV_REF>,
84 __callable<_Vt _GLIBCXX_MOF_INV_QUALS>>;
87 using result_type = _Res;
97 : _Base(
static_cast<_Base&&
>(__x)),
98 _M_invoke(std::__exchange(__x._M_invoke,
nullptr))
102 template<
typename _Fn,
typename _Vt = decay_t<_Fn>>
103 requires (!is_same_v<_Vt, move_only_function>)
104 && (!__is_in_place_type_v<_Vt>) && __is_callable_from<_Vt>
110 if constexpr (is_function_v<remove_pointer_t<_Vt>>
111 || is_member_pointer_v<_Vt>
112 || __is_polymorphic_function_v<_Vt>)
118 if constexpr (__is_polymorphic_function_v<_Vt>
119 && __polyfunc::__is_invoker_convertible<_Vt, move_only_function>())
124 _M_move(__polyfunc::__base_of(__tmp));
125 _M_invoke = std::__exchange(__polyfunc::__invoker_of(__tmp),
nullptr);
130 _M_invoke = _Invoker::template _S_storage<_Vt _GLIBCXX_MOF_INV_QUALS>();
135 template<
typename _Tp,
typename... _Args>
136 requires is_constructible_v<_Tp, _Args...>
137 && __is_callable_from<_Tp>
140 noexcept(_S_nothrow_init<_Tp, _Args...>())
141 : _M_invoke(_Invoker::template _S_storage<_Tp _GLIBCXX_MOF_INV_QUALS>())
143 static_assert(is_same_v<decay_t<_Tp>, _Tp>);
148 template<
typename _Tp,
typename _Up,
typename... _Args>
149 requires is_constructible_v<_Tp, initializer_list<_Up>&, _Args...>
150 && __is_callable_from<_Tp>
154 noexcept(_S_nothrow_init<_Tp, initializer_list<_Up>&, _Args...>())
155 : _M_invoke(_Invoker::template _S_storage<_Tp _GLIBCXX_MOF_INV_QUALS>())
157 static_assert(is_same_v<decay_t<_Tp>, _Tp>);
169 _Base::operator=(
static_cast<_Base&&
>(__x));
170 _M_invoke = std::__exchange(__x._M_invoke,
nullptr);
185 template<
typename _Fn>
186 requires is_constructible_v<move_only_function, _Fn>
189 noexcept(is_nothrow_constructible_v<move_only_function, _Fn>)
195 ~move_only_function() =
default;
198 explicit operator bool() const noexcept
199 {
return _M_invoke !=
nullptr; }
210 operator()(_ArgTypes... __args) _GLIBCXX_MOF_CV_REF
noexcept(_Noex)
212 __glibcxx_assert(*
this !=
nullptr);
221 std::swap(_M_invoke, __x._M_invoke);
232 {
return __x._M_invoke ==
nullptr; }
235 typename _Invoker::__storage_func_t _M_invoke =
nullptr;
237 template<
typename _Func>
238 friend constexpr auto&
239 __polyfunc::__invoker_of(_Func&)
noexcept;
241 template<
typename _Func>
242 friend constexpr auto&
243 __polyfunc::__base_of(_Func&)
noexcept;
245 template<
typename _Src,
typename _Dst>
246 friend consteval bool
247 __polyfunc::__is_invoker_convertible() noexcept;