23 General utilities library [utilities]

23.14 Function objects [function.objects]

23.14.10 Function template not_­fn [func.not_fn]

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

Effects: Эквивалентен return call_­wrapper(std​::​forward<F>(f)); where call_­wrapper класс только для показа, определенный следующим образом:

class call_wrapper {
  using FD = decay_t<F>;
  FD fd;

  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<invoke_result_t<FD&, Args...>>());

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

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

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

explicit call_wrapper(F&& f);

Requires: FD должны удовлетворять требованиям MoveConstructible. is_­constructible_­v<FD, F> будет true. fd должен быть callable object.

Effects: Инициализируется fd из std​::​forward<F>(f).

Throws: Любое исключение, созданное при построении fd.

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

Effects: Эквивалентен:

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

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

Effects: Эквивалентен:

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