20 General utilities library [utilities]

20.14 Function objects [function.objects]

20.14.9 Function template not_fn [func.not_fn]

template <class F> unspecified not_fn(F&& f);

Effects: Equivalent to return call_wrapper(std::forward<F>(f)); where call_wrapper is an exposition only class defined as follows:

class call_wrapper{
   using FD = decay_t<F>;
   explicit call_wrapper(F&& f);

public:
   call_wrapper(call_wrapper&&) = default;
   call_wrapper(const call_wrapper&) = default;

   template<class... Args>
     auto operator()(Args&&...) &
       -> decltype(!declval<result_of_t<FD&(Args&&...)>>());

   template<class... Args>
     auto operator()(Args&&...) const&
       -> decltype(!declval<result_of_t<const FD&(Args&&...)>>());

   template<class... Args>
     auto operator()(Args&&...) &&
       -> decltype(!declval<result_of_t<FD(Args&&...)>>());

   template<class... Args>
     auto operator()(Args&&...) const&&
       -> decltype(!declval<result_of_t<const FD(Args&&...)>>());

private:
  FD fd;
};

explicit call_wrapper(F&& f);

Requires: FD shall satisfy the requirements of MoveConstructible. is_constructible_v<FD, F> shall be true. fd shall be a callable object ([func.def]).

Effects: Initializes fd from std::forward<F>(f).

Throws: Any exception thrown by construction of fd.

template<class... Args> auto operator()(Args&&... args) & -> decltype(!declval<result_of_t<FD&(Args&&...)>>()); template<class... Args> auto operator()(Args&&... args) const& -> decltype(!declval<result_of_t<const FD&(Args&&...)>>());

Effects: Equivalent to: return !INVOKE(fd, std::forward<Args>(args)...); ([func.require]).

template<class... Args> auto operator()(Args&&... args) && -> decltype(!declval<result_of_t<FD(Args&&...)>>()); template<class... Args> auto operator()(Args&&... args) const&& -> decltype(!declval<result_of_t<const FD(Args&&...)>>());

Effects: Equivalent to: return !INVOKE(std::move(fd), std::forward<Args>(args)...); ([func.require]).