std::not_fn(3) | C++ Standard Libary | std::not_fn(3) |
NAME¶
std::not_fn - std::not_fn
Synopsis¶
Defined in header <functional>
template< class F> (since C++17)
/*unspecified*/ not_fn( F&& f ); (until C++20)
template< class F> (since C++20)
constexpr /*unspecified*/ not_fn( F&& f );
Creates a forwarding call wrapper that returns the negation of the callable
object
it holds.
Parameters¶
f - the object from which the Callable object held by the wrapper
is
constructed
Type requirements¶
-
std::decay_t<F> must meet the requirements of Callable and
MoveConstructible.
-
std::is_constructible_v<std::decay_t<F>, F> is required to be
true
Return value¶
A function object of unspecified type T. It has the following members:
std::not_fn return type
Member objects¶
The return type of std::not_fn holds a member object of type std::decay_t<F>.
Constructors
explicit T(F&& f); // exposition only (since C++17)
(until C++20)
explicit constexpr T(F&& f); // exposition only (1) (since
C++20)
T(T&& f) = default; (2)
T(const T& f) = default;
1) The constructor direct-non-list-initializes the member object (of type
std::decay_t<F>) from std::forward<F>(f). Throws any exception
thrown by the
constructor selected
2) Because std::decay_t<F> is required to be MoveConstructible, the
returned call
wrapper is always MoveConstructible, and is CopyConstructible if
std::decay_t<F> is
CopyConstructible.
Member function operator()¶
template<class... Args> auto operator()(Args&&... args) &
-> decltype(
!std::declval<std::invoke_result_t<std::decay_t<F>&, (since
Args...>>()); C++17)
template<class... Args> auto operator()(Args&&... args) (until
const& C++20)
-> decltype(
!std::declval<std::invoke_result_t<std::decay_t<F> const&,
Args...>>());
template<class... Args> constexpr auto operator()(Args&&...
args) &
noexcept(/*see below*/)
-> decltype(
!std::declval<std::invoke_result_t<std::decay_t<F>&,
Args...>>()); (since
template<class... Args> constexpr auto operator()(Args&&...
C++20)
args) const&
noexcept(/*see below*/)
-> decltype(
!std::declval<std::invoke_result_t<std::decay_t<F> const&,
Args...>>()); (1)
template<class... Args> auto operator()(Args&&... args)
&&
-> decltype(
!std::declval<std::invoke_result_t<std::decay_t<F>, (since
Args...>>()); C++17)
template<class... Args> auto operator()(Args&&... args) (until
const&& C++20)
-> decltype(
!std::declval<std::invoke_result_t<std::decay_t<F> const,
Args...>>());
template<class... Args> constexpr auto operator()(Args&&...
args) && (2)
noexcept(/*see below*/)
-> decltype(
!std::declval<std::invoke_result_t<std::decay_t<F>,
Args...>>()); (since
template<class... Args> constexpr auto operator()(Args&&...
C++20)
args) const&&
noexcept(/*see below*/)
-> decltype(
!std::declval<std::invoke_result_t<std::decay_t<F> const,
Args...>>());
1) Equivalent to return !std::invoke(fd, std::forward<Args>(args)...);
(since C++17)
2) Equivalent to return !std::invoke(std::move(fd), (until C++20)
std::forward<Args>(args)...);
1) Expression-equivalent to !std::invoke(fd,
std::forward<Args>(args)...) (since C++20)
2) Expression-equivalent to !std::invoke(std::move(fd),
std::forward<Args>(args)...)
where fd is the member object of type std::decay_t<F>
Expression-equivalent
Expression e is expression-equivalent to expression f, if
* e and f have the same effects, and
* either both are constant subexpressions or else neither is a constant
subexpression, and
* either both are potentially-throwing or else neither is
potentially-throwing
(i.e. noexcept(e) == noexcept(f)).
Exceptions¶
Throws no exceptions, unless the construction of fd throws.
Possible implementation¶
namespace detail {
template<class F>
struct not_fn_t {
F f;
template<class... Args>
constexpr auto operator()(Args&&... args) &
noexcept(noexcept(!std::invoke(f, std::forward<Args>(args)...)))
-> decltype(!std::invoke(f, std::forward<Args>(args)...))
{
return !std::invoke(f, std::forward<Args>(args)...);
}
template<class... Args>
constexpr auto operator()(Args&&... args) const&
noexcept(noexcept(!std::invoke(f, std::forward<Args>(args)...)))
-> decltype(!std::invoke(f, std::forward<Args>(args)...))
{
return !std::invoke(f, std::forward<Args>(args)...);
}
template<class... Args>
constexpr auto operator()(Args&&... args) &&
noexcept(noexcept(!std::invoke(std::move(f),
std::forward<Args>(args)...)))
-> decltype(!std::invoke(std::move(f), std::forward<Args>(args)...))
{
return !std::invoke(std::move(f), std::forward<Args>(args)...);
}
template<class... Args>
constexpr auto operator()(Args&&... args) const&&
noexcept(noexcept(!std::invoke(std::move(f),
std::forward<Args>(args)...)))
-> decltype(!std::invoke(std::move(f), std::forward<Args>(args)...))
{
return !std::invoke(std::move(f), std::forward<Args>(args)...);
}
};
}
template<class F>
constexpr detail::not_fn_t<std::decay_t<F>> not_fn(F&& f)
{
return { std::forward<F>(f) };
}
Notes¶
not_fn is intended to replace the C++03-era negators std::not1 and std::not2.
Feature-test macro: __cpp_lib_not_fn
Example¶
This section is incomplete
Reason: no example
See also¶
not1 constructs custom std::unary_negate object
(deprecated in C++17) (function template)
(removed in C++20)
not2 constructs custom std::binary_negate object
(deprecated in C++17) (function template)
(removed in C++20)
2022.07.31 | http://cppreference.com |