xref: /netbsd-src/external/gpl3/gcc/dist/libstdc++-v3/include/bits/std_function.h (revision b1e838363e3c6fc78a55519254d99869742dd33c)
1 // Implementation of std::function -*- C++ -*-
2 
3 // Copyright (C) 2004-2022 Free Software Foundation, Inc.
4 //
5 // This file is part of the GNU ISO C++ Library.  This library is free
6 // software; you can redistribute it and/or modify it under the
7 // terms of the GNU General Public License as published by the
8 // Free Software Foundation; either version 3, or (at your option)
9 // any later version.
10 
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 // GNU General Public License for more details.
15 
16 // Under Section 7 of GPL version 3, you are granted additional
17 // permissions described in the GCC Runtime Library Exception, version
18 // 3.1, as published by the Free Software Foundation.
19 
20 // You should have received a copy of the GNU General Public License and
21 // a copy of the GCC Runtime Library Exception along with this program;
22 // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23 // <http://www.gnu.org/licenses/>.
24 
25 /** @file include/bits/std_function.h
26  *  This is an internal header file, included by other library headers.
27  *  Do not attempt to use it directly. @headername{functional}
28  */
29 
30 #ifndef _GLIBCXX_STD_FUNCTION_H
31 #define _GLIBCXX_STD_FUNCTION_H 1
32 
33 #pragma GCC system_header
34 
35 #if __cplusplus < 201103L
36 # include <bits/c++0x_warning.h>
37 #else
38 
39 #include <typeinfo>
40 #include <bits/stl_function.h>
41 #include <bits/invoke.h>
42 #include <bits/refwrap.h>
43 #include <bits/functexcept.h>
44 
_GLIBCXX_VISIBILITY(default)45 namespace std _GLIBCXX_VISIBILITY(default)
46 {
47 _GLIBCXX_BEGIN_NAMESPACE_VERSION
48 
49   /**
50    *  @brief Exception class thrown when class template function's
51    *  operator() is called with an empty target.
52    *  @ingroup exceptions
53    */
54   class bad_function_call : public std::exception
55   {
56   public:
57     virtual ~bad_function_call() noexcept;
58 
59     const char* what() const noexcept;
60   };
61 
62   /**
63    *  Trait identifying "location-invariant" types, meaning that the
64    *  address of the object (or any of its members) will not escape.
65    *  Trivially copyable types are location-invariant and users can
66    *  specialize this trait for other types.
67    */
68   template<typename _Tp>
69     struct __is_location_invariant
70     : is_trivially_copyable<_Tp>::type
71     { };
72 
73   class _Undefined_class;
74 
75   union _Nocopy_types
76   {
77     void*       _M_object;
78     const void* _M_const_object;
79     void (*_M_function_pointer)();
80     void (_Undefined_class::*_M_member_pointer)();
81   };
82 
83   union [[gnu::may_alias]] _Any_data
84   {
85     void*       _M_access()       noexcept { return &_M_pod_data[0]; }
86     const void* _M_access() const noexcept { return &_M_pod_data[0]; }
87 
88     template<typename _Tp>
89       _Tp&
90       _M_access() noexcept
91       { return *static_cast<_Tp*>(_M_access()); }
92 
93     template<typename _Tp>
94       const _Tp&
95       _M_access() const noexcept
96       { return *static_cast<const _Tp*>(_M_access()); }
97 
98     _Nocopy_types _M_unused;
99     char _M_pod_data[sizeof(_Nocopy_types)];
100   };
101 
102   enum _Manager_operation
103   {
104     __get_type_info,
105     __get_functor_ptr,
106     __clone_functor,
107     __destroy_functor
108   };
109 
110   template<typename _Signature>
111     class function;
112 
113   /// Base class of all polymorphic function object wrappers.
114   class _Function_base
115   {
116   public:
117     static const size_t _M_max_size = sizeof(_Nocopy_types);
118     static const size_t _M_max_align = __alignof__(_Nocopy_types);
119 
120     template<typename _Functor>
121       class _Base_manager
122       {
123       protected:
124 	static const bool __stored_locally =
125 	(__is_location_invariant<_Functor>::value
126 	 && sizeof(_Functor) <= _M_max_size
127 	 && __alignof__(_Functor) <= _M_max_align
128 	 && (_M_max_align % __alignof__(_Functor) == 0));
129 
130 	using _Local_storage = integral_constant<bool, __stored_locally>;
131 
132 	// Retrieve a pointer to the function object
133 	static _Functor*
134 	_M_get_pointer(const _Any_data& __source) noexcept
135 	{
136 	  if _GLIBCXX17_CONSTEXPR (__stored_locally)
137 	    {
138 	      const _Functor& __f = __source._M_access<_Functor>();
139 	      return const_cast<_Functor*>(std::__addressof(__f));
140 	    }
141 	  else // have stored a pointer
142 	    return __source._M_access<_Functor*>();
143 	}
144 
145       private:
146 	// Construct a location-invariant function object that fits within
147 	// an _Any_data structure.
148 	template<typename _Fn>
149 	  static void
150 	  _M_create(_Any_data& __dest, _Fn&& __f, true_type)
151 	  {
152 	    ::new (__dest._M_access()) _Functor(std::forward<_Fn>(__f));
153 	  }
154 
155 	// Construct a function object on the heap and store a pointer.
156 	template<typename _Fn>
157 	  static void
158 	  _M_create(_Any_data& __dest, _Fn&& __f, false_type)
159 	  {
160 	    __dest._M_access<_Functor*>()
161 	      = new _Functor(std::forward<_Fn>(__f));
162 	  }
163 
164 	// Destroy an object stored in the internal buffer.
165 	static void
166 	_M_destroy(_Any_data& __victim, true_type)
167 	{
168 	  __victim._M_access<_Functor>().~_Functor();
169 	}
170 
171 	// Destroy an object located on the heap.
172 	static void
173 	_M_destroy(_Any_data& __victim, false_type)
174 	{
175 	  delete __victim._M_access<_Functor*>();
176 	}
177 
178       public:
179 	static bool
180 	_M_manager(_Any_data& __dest, const _Any_data& __source,
181 		   _Manager_operation __op)
182 	{
183 	  switch (__op)
184 	    {
185 	    case __get_type_info:
186 #if __cpp_rtti
187 	      __dest._M_access<const type_info*>() = &typeid(_Functor);
188 #else
189 	      __dest._M_access<const type_info*>() = nullptr;
190 #endif
191 	      break;
192 
193 	    case __get_functor_ptr:
194 	      __dest._M_access<_Functor*>() = _M_get_pointer(__source);
195 	      break;
196 
197 	    case __clone_functor:
198 	      _M_init_functor(__dest,
199 		  *const_cast<const _Functor*>(_M_get_pointer(__source)));
200 	      break;
201 
202 	    case __destroy_functor:
203 	      _M_destroy(__dest, _Local_storage());
204 	      break;
205 	    }
206 	  return false;
207 	}
208 
209 	template<typename _Fn>
210 	  static void
211 	  _M_init_functor(_Any_data& __functor, _Fn&& __f)
212 	  noexcept(__and_<_Local_storage,
213 			  is_nothrow_constructible<_Functor, _Fn>>::value)
214 	  {
215 	    _M_create(__functor, std::forward<_Fn>(__f), _Local_storage());
216 	  }
217 
218 	template<typename _Signature>
219 	  static bool
220 	  _M_not_empty_function(const function<_Signature>& __f) noexcept
221 	  { return static_cast<bool>(__f); }
222 
223 	template<typename _Tp>
224 	  static bool
225 	  _M_not_empty_function(_Tp* __fp) noexcept
226 	  { return __fp != nullptr; }
227 
228 	template<typename _Class, typename _Tp>
229 	  static bool
230 	  _M_not_empty_function(_Tp _Class::* __mp) noexcept
231 	  { return __mp != nullptr; }
232 
233 	template<typename _Tp>
234 	  static bool
235 	  _M_not_empty_function(const _Tp&) noexcept
236 	  { return true; }
237       };
238 
239     _Function_base() = default;
240 
241     ~_Function_base()
242     {
243       if (_M_manager)
244 	_M_manager(_M_functor, _M_functor, __destroy_functor);
245     }
246 
247     bool _M_empty() const { return !_M_manager; }
248 
249     using _Manager_type
250       = bool (*)(_Any_data&, const _Any_data&, _Manager_operation);
251 
252     _Any_data     _M_functor{};
253     _Manager_type _M_manager{};
254   };
255 
256   template<typename _Signature, typename _Functor>
257     class _Function_handler;
258 
259   template<typename _Res, typename _Functor, typename... _ArgTypes>
260     class _Function_handler<_Res(_ArgTypes...), _Functor>
261     : public _Function_base::_Base_manager<_Functor>
262     {
263       using _Base = _Function_base::_Base_manager<_Functor>;
264 
265     public:
266       static bool
267       _M_manager(_Any_data& __dest, const _Any_data& __source,
268 		 _Manager_operation __op)
269       {
270 	switch (__op)
271 	  {
272 #if __cpp_rtti
273 	  case __get_type_info:
274 	    __dest._M_access<const type_info*>() = &typeid(_Functor);
275 	    break;
276 #endif
277 	  case __get_functor_ptr:
278 	    __dest._M_access<_Functor*>() = _Base::_M_get_pointer(__source);
279 	    break;
280 
281 	  default:
282 	    _Base::_M_manager(__dest, __source, __op);
283 	  }
284 	return false;
285       }
286 
287       static _Res
288       _M_invoke(const _Any_data& __functor, _ArgTypes&&... __args)
289       {
290 	return std::__invoke_r<_Res>(*_Base::_M_get_pointer(__functor),
291 				     std::forward<_ArgTypes>(__args)...);
292       }
293 
294       template<typename _Fn>
295 	static constexpr bool
296 	_S_nothrow_init() noexcept
297 	{
298 	  return __and_<typename _Base::_Local_storage,
299 			is_nothrow_constructible<_Functor, _Fn>>::value;
300 	}
301     };
302 
303   // Specialization for invalid types
304   template<>
305     class _Function_handler<void, void>
306     {
307     public:
308       static bool
309       _M_manager(_Any_data&, const _Any_data&, _Manager_operation)
310       { return false; }
311     };
312 
313   // Avoids instantiating ill-formed specializations of _Function_handler
314   // in std::function<_Signature>::target<_Functor>().
315   // e.g. _Function_handler<Sig, void()> and _Function_handler<Sig, void>
316   // would be ill-formed.
317   template<typename _Signature, typename _Functor,
318 	   bool __valid = is_object<_Functor>::value>
319     struct _Target_handler
320     : _Function_handler<_Signature, typename remove_cv<_Functor>::type>
321     { };
322 
323   template<typename _Signature, typename _Functor>
324     struct _Target_handler<_Signature, _Functor, false>
325     : _Function_handler<void, void>
326     { };
327 
328   /**
329    *  @brief Polymorphic function wrapper.
330    *  @ingroup functors
331    *  @since C++11
332    */
333   template<typename _Res, typename... _ArgTypes>
334     class function<_Res(_ArgTypes...)>
335     : public _Maybe_unary_or_binary_function<_Res, _ArgTypes...>,
336       private _Function_base
337     {
338       // Equivalent to std::decay_t except that it produces an invalid type
339       // if the decayed type is the current specialization of std::function.
340       template<typename _Func,
341 	       bool _Self = is_same<__remove_cvref_t<_Func>, function>::value>
342 	using _Decay_t
343 	  = typename __enable_if_t<!_Self, decay<_Func>>::type;
344 
345       template<typename _Func,
346 	       typename _DFunc = _Decay_t<_Func>,
347 	       typename _Res2 = __invoke_result<_DFunc&, _ArgTypes...>>
348 	struct _Callable
349 	: __is_invocable_impl<_Res2, _Res>::type
350 	{ };
351 
352       template<typename _Cond, typename _Tp = void>
353 	using _Requires = __enable_if_t<_Cond::value, _Tp>;
354 
355       template<typename _Functor>
356 	using _Handler
357 	  = _Function_handler<_Res(_ArgTypes...), __decay_t<_Functor>>;
358 
359     public:
360       typedef _Res result_type;
361 
362       // [3.7.2.1] construct/copy/destroy
363 
364       /**
365        *  @brief Default construct creates an empty function call wrapper.
366        *  @post `!(bool)*this`
367        */
368       function() noexcept
369       : _Function_base() { }
370 
371       /**
372        *  @brief Creates an empty function call wrapper.
373        *  @post @c !(bool)*this
374        */
375       function(nullptr_t) noexcept
376       : _Function_base() { }
377 
378       /**
379        *  @brief %Function copy constructor.
380        *  @param __x A %function object with identical call signature.
381        *  @post `bool(*this) == bool(__x)`
382        *
383        *  The newly-created %function contains a copy of the target of
384        *  `__x` (if it has one).
385        */
386       function(const function& __x)
387       : _Function_base()
388       {
389 	if (static_cast<bool>(__x))
390 	  {
391 	    __x._M_manager(_M_functor, __x._M_functor, __clone_functor);
392 	    _M_invoker = __x._M_invoker;
393 	    _M_manager = __x._M_manager;
394 	  }
395       }
396 
397       /**
398        *  @brief %Function move constructor.
399        *  @param __x A %function object rvalue with identical call signature.
400        *
401        *  The newly-created %function contains the target of `__x`
402        *  (if it has one).
403        */
404       function(function&& __x) noexcept
405       : _Function_base(), _M_invoker(__x._M_invoker)
406       {
407 	if (static_cast<bool>(__x))
408 	  {
409 	    _M_functor = __x._M_functor;
410 	    _M_manager = __x._M_manager;
411 	    __x._M_manager = nullptr;
412 	    __x._M_invoker = nullptr;
413 	  }
414       }
415 
416       /**
417        *  @brief Builds a %function that targets a copy of the incoming
418        *  function object.
419        *  @param __f A %function object that is callable with parameters of
420        *  type `ArgTypes...` and returns a value convertible to `Res`.
421        *
422        *  The newly-created %function object will target a copy of
423        *  `__f`. If `__f` is `reference_wrapper<F>`, then this function
424        *  object will contain a reference to the function object `__f.get()`.
425        *  If `__f` is a null function pointer, null pointer-to-member, or
426        *  empty `std::function`, the newly-created object will be empty.
427        *
428        *  If `__f` is a non-null function pointer or an object of type
429        *  `reference_wrapper<F>`, this function will not throw.
430        */
431       // _GLIBCXX_RESOLVE_LIB_DEFECTS
432       // 2774. std::function construction vs assignment
433       template<typename _Functor,
434 	       typename _Constraints = _Requires<_Callable<_Functor>>>
435 	function(_Functor&& __f)
436 	noexcept(_Handler<_Functor>::template _S_nothrow_init<_Functor>())
437 	: _Function_base()
438 	{
439 	  static_assert(is_copy_constructible<__decay_t<_Functor>>::value,
440 	      "std::function target must be copy-constructible");
441 	  static_assert(is_constructible<__decay_t<_Functor>, _Functor>::value,
442 	      "std::function target must be constructible from the "
443 	      "constructor argument");
444 
445 	  using _My_handler = _Handler<_Functor>;
446 
447 	  if (_My_handler::_M_not_empty_function(__f))
448 	    {
449 	      _My_handler::_M_init_functor(_M_functor,
450 					   std::forward<_Functor>(__f));
451 	      _M_invoker = &_My_handler::_M_invoke;
452 	      _M_manager = &_My_handler::_M_manager;
453 	    }
454 	}
455 
456       /**
457        *  @brief Function assignment operator.
458        *  @param __x A %function with identical call signature.
459        *  @post `(bool)*this == (bool)x`
460        *  @returns `*this`
461        *
462        *  The target of `__x` is copied to `*this`. If `__x` has no
463        *  target, then `*this` will be empty.
464        *
465        *  If `__x` targets a function pointer or a reference to a function
466        *  object, then this operation will not throw an exception.
467        */
468       function&
469       operator=(const function& __x)
470       {
471 	function(__x).swap(*this);
472 	return *this;
473       }
474 
475       /**
476        *  @brief Function move-assignment operator.
477        *  @param __x A %function rvalue with identical call signature.
478        *  @returns `*this`
479        *
480        *  The target of `__x` is moved to `*this`. If `__x` has no
481        *  target, then `*this` will be empty.
482        *
483        *  If `__x` targets a function pointer or a reference to a function
484        *  object, then this operation will not throw an exception.
485        */
486       function&
487       operator=(function&& __x) noexcept
488       {
489 	function(std::move(__x)).swap(*this);
490 	return *this;
491       }
492 
493       /**
494        *  @brief Function assignment to empty.
495        *  @post `!(bool)*this`
496        *  @returns `*this`
497        *
498        *  The target of `*this` is deallocated, leaving it empty.
499        */
500       function&
501       operator=(nullptr_t) noexcept
502       {
503 	if (_M_manager)
504 	  {
505 	    _M_manager(_M_functor, _M_functor, __destroy_functor);
506 	    _M_manager = nullptr;
507 	    _M_invoker = nullptr;
508 	  }
509 	return *this;
510       }
511 
512       /**
513        *  @brief Function assignment to a new target.
514        *  @param __f  A function object that is callable with parameters of
515        *              type  `_ArgTypes...` and returns a value convertible
516        *              to `_Res`.
517        *  @return `*this`
518        *  @since C++11
519        *
520        *  This function object wrapper will target a copy of `__f`. If `__f`
521        *  is `reference_wrapper<F>`, then this function object will contain
522        *  a reference to the function object `__f.get()`. If `__f` is a null
523        *  function pointer or null pointer-to-member, this object will be
524        *  empty.
525        *
526        *  If `__f` is a non-null function pointer or an object of type
527        *  `reference_wrapper<F>`, this function will not throw.
528        */
529       template<typename _Functor>
530 	_Requires<_Callable<_Functor>, function&>
531 	operator=(_Functor&& __f)
532 	noexcept(_Handler<_Functor>::template _S_nothrow_init<_Functor>())
533 	{
534 	  function(std::forward<_Functor>(__f)).swap(*this);
535 	  return *this;
536 	}
537 
538       /// @overload
539       template<typename _Functor>
540 	function&
541 	operator=(reference_wrapper<_Functor> __f) noexcept
542 	{
543 	  function(__f).swap(*this);
544 	  return *this;
545 	}
546 
547       // [3.7.2.2] function modifiers
548 
549       /**
550        *  @brief Swap the targets of two %function objects.
551        *  @param __x A %function with identical call signature.
552        *
553        *  Swap the targets of `this` function object and `__f`.
554        *  This function will not throw exceptions.
555        */
556       void swap(function& __x) noexcept
557       {
558 	std::swap(_M_functor, __x._M_functor);
559 	std::swap(_M_manager, __x._M_manager);
560 	std::swap(_M_invoker, __x._M_invoker);
561       }
562 
563       // [3.7.2.3] function capacity
564 
565       /**
566        *  @brief Determine if the %function wrapper has a target.
567        *
568        *  @return `true` when this function object contains a target,
569        *  or `false` when it is empty.
570        *
571        *  This function will not throw exceptions.
572        */
573       explicit operator bool() const noexcept
574       { return !_M_empty(); }
575 
576       // [3.7.2.4] function invocation
577 
578       /**
579        *  @brief Invokes the function targeted by `*this`.
580        *  @returns the result of the target.
581        *  @throws `bad_function_call` when `!(bool)*this`
582        *
583        *  The function call operator invokes the target function object
584        *  stored by `this`.
585        */
586       _Res
587       operator()(_ArgTypes... __args) const
588       {
589 	if (_M_empty())
590 	  __throw_bad_function_call();
591 	return _M_invoker(_M_functor, std::forward<_ArgTypes>(__args)...);
592       }
593 
594 #if __cpp_rtti
595       // [3.7.2.5] function target access
596       /**
597        *  @brief Determine the type of the target of this function object
598        *  wrapper.
599        *
600        *  @returns the type identifier of the target function object, or
601        *  `typeid(void)` if `!(bool)*this`.
602        *
603        *  This function will not throw exceptions.
604        */
605       const type_info&
606       target_type() const noexcept
607       {
608 	if (_M_manager)
609 	  {
610 	    _Any_data __typeinfo_result;
611 	    _M_manager(__typeinfo_result, _M_functor, __get_type_info);
612 	    if (auto __ti =  __typeinfo_result._M_access<const type_info*>())
613 	      return *__ti;
614 	  }
615 	return typeid(void);
616       }
617 #endif
618 
619       /**
620        *  @brief Access the stored target function object.
621        *
622        *  @return Returns a pointer to the stored target function object,
623        *  if `typeid(_Functor).equals(target_type())`; otherwise, a null
624        *  pointer.
625        *
626        * This function does not throw exceptions.
627        *
628        * @{
629        */
630       template<typename _Functor>
631 	_Functor*
632 	target() noexcept
633 	{
634 	  const function* __const_this = this;
635 	  const _Functor* __func = __const_this->template target<_Functor>();
636 	  // If is_function_v<_Functor> is true then const_cast<_Functor*>
637 	  // would be ill-formed, so use *const_cast<_Functor**> instead.
638 	  return *const_cast<_Functor**>(&__func);
639 	}
640 
641       template<typename _Functor>
642 	const _Functor*
643 	target() const noexcept
644 	{
645 	  if _GLIBCXX17_CONSTEXPR (is_object<_Functor>::value)
646 	    {
647 	      // For C++11 and C++14 if-constexpr is not used above, so
648 	      // _Target_handler avoids ill-formed _Function_handler types.
649 	      using _Handler = _Target_handler<_Res(_ArgTypes...), _Functor>;
650 
651 	      if (_M_manager == &_Handler::_M_manager
652 #if __cpp_rtti
653 		  || (_M_manager && typeid(_Functor) == target_type())
654 #endif
655 		 )
656 		{
657 		  _Any_data __ptr;
658 		  _M_manager(__ptr, _M_functor, __get_functor_ptr);
659 		  return __ptr._M_access<const _Functor*>();
660 		}
661 	    }
662 	  return nullptr;
663 	}
664       /// @}
665 
666     private:
667       using _Invoker_type = _Res (*)(const _Any_data&, _ArgTypes&&...);
668       _Invoker_type _M_invoker = nullptr;
669     };
670 
671 #if __cpp_deduction_guides >= 201606
672   template<typename>
673     struct __function_guide_helper
674     { };
675 
676   template<typename _Res, typename _Tp, bool _Nx, typename... _Args>
677     struct __function_guide_helper<
678       _Res (_Tp::*) (_Args...) noexcept(_Nx)
679     >
680     { using type = _Res(_Args...); };
681 
682   template<typename _Res, typename _Tp, bool _Nx, typename... _Args>
683     struct __function_guide_helper<
684       _Res (_Tp::*) (_Args...) & noexcept(_Nx)
685     >
686     { using type = _Res(_Args...); };
687 
688   template<typename _Res, typename _Tp, bool _Nx, typename... _Args>
689     struct __function_guide_helper<
690       _Res (_Tp::*) (_Args...) const noexcept(_Nx)
691     >
692     { using type = _Res(_Args...); };
693 
694   template<typename _Res, typename _Tp, bool _Nx, typename... _Args>
695     struct __function_guide_helper<
696       _Res (_Tp::*) (_Args...) const & noexcept(_Nx)
697     >
698     { using type = _Res(_Args...); };
699 
700   template<typename _Res, typename... _ArgTypes>
701     function(_Res(*)(_ArgTypes...)) -> function<_Res(_ArgTypes...)>;
702 
703   template<typename _Functor, typename _Signature = typename
704 	   __function_guide_helper<decltype(&_Functor::operator())>::type>
705     function(_Functor) -> function<_Signature>;
706 #endif
707 
708   // [20.7.15.2.6] null pointer comparisons
709 
710   /**
711    *  @brief Test whether a polymorphic function object wrapper is empty.
712    *  @returns `true` if the wrapper has no target, `false` otherwise
713    *
714    *  This function will not throw exceptions.
715    */
716   template<typename _Res, typename... _Args>
717     inline bool
718     operator==(const function<_Res(_Args...)>& __f, nullptr_t) noexcept
719     { return !static_cast<bool>(__f); }
720 
721 #if __cpp_impl_three_way_comparison < 201907L
722   /// @overload
723   template<typename _Res, typename... _Args>
724     inline bool
725     operator==(nullptr_t, const function<_Res(_Args...)>& __f) noexcept
726     { return !static_cast<bool>(__f); }
727 
728   /**
729    *  @brief Test whether a polymorphic function object wrapper is non-empty.
730    *  @returns `false` if the wrapper has no target, `true` otherwise
731    *
732    *  This function will not throw exceptions.
733    */
734   template<typename _Res, typename... _Args>
735     inline bool
736     operator!=(const function<_Res(_Args...)>& __f, nullptr_t) noexcept
737     { return static_cast<bool>(__f); }
738 
739   /// @overload
740   template<typename _Res, typename... _Args>
741     inline bool
742     operator!=(nullptr_t, const function<_Res(_Args...)>& __f) noexcept
743     { return static_cast<bool>(__f); }
744 #endif
745 
746   // [20.7.15.2.7] specialized algorithms
747 
748   /**
749    *  @brief Swap the targets of two polymorphic function object wrappers.
750    *
751    *  This function will not throw exceptions.
752    */
753   // _GLIBCXX_RESOLVE_LIB_DEFECTS
754   // 2062. Effect contradictions w/o no-throw guarantee of std::function swaps
755   template<typename _Res, typename... _Args>
756     inline void
757     swap(function<_Res(_Args...)>& __x, function<_Res(_Args...)>& __y) noexcept
758     { __x.swap(__y); }
759 
760 #if __cplusplus >= 201703L
761   namespace __detail::__variant
762   {
763     template<typename> struct _Never_valueless_alt; // see <variant>
764 
765     // Provide the strong exception-safety guarantee when emplacing a
766     // function into a variant.
767     template<typename _Signature>
768       struct _Never_valueless_alt<std::function<_Signature>>
769       : std::true_type
770       { };
771   }  // namespace __detail::__variant
772 #endif // C++17
773 
774 _GLIBCXX_END_NAMESPACE_VERSION
775 } // namespace std
776 
777 #endif // C++11
778 #endif // _GLIBCXX_STD_FUNCTION_H
779