std::not_fn
| Definido en el archivo de encabezado <functional>
|
||
template< class F> /*no especificado*/ not_fn( F&& f ); |
(desde C++17) (hasta C++20) |
|
template< class F> constexpr /*no especificado*/ not_fn( F&& f ); |
(desde C++20) | |
Crea un envoltorio de llamada de reenvío que devuelve la negación del objeto invocable que contiene.
Parámetros
| f | - | El objeto a partir del cual se construye el objeto Callable retenido por el envoltorio. |
| Requisitos de tipo | ||
- debe satisfacer los requisitos de Callable y MoveConstructible.
| ||
-Se requiere que std::is_constructible_v<std::decay_t<F>, F> sea true.
| ||
Valor de retorno
Un objeto función de tipo T no especificado. Tiene los siguientes miembros:
std::not_fn return type
Objetos miembro
El tipo de retorno de std::not_fn contiene un objeto miembro de tipo std::decay_t<F>.
Constructoes
<tbody> </tbody> <tbody class="t-dcl-rev t-dcl-rev-num "> </tbody><tbody> </tbody>| (1) | ||
explicit T(F&& f); // solo exposición |
(desde C++17) (hasta C++20) |
|
explicit constexpr T(F&& f); // solo exposición |
(desde C++20) | |
T(T&& f) = default; T(const T& f) = default; |
(2) | |
std::decay_t<F>) directamente, sin usar inicialización de lista, a partir de std::forward<F>(f). Lanza cualquier excepción lanzada por el constructor seleccionado.std::decay_t<F> sea MoveConstructible, el envoltorio de llamada devuelto siempre es MoveConstructible, y es CopyConstructible si std::decay_t<F> es CopyConstructible.Función miembro operator()
<tbody>
</tbody>
<tbody class="t-dcl-rev t-dcl-rev-num ">
</tbody><tbody>
</tbody>
<tbody class="t-dcl-rev t-dcl-rev-num ">
</tbody><tbody>
</tbody>| (1) | ||
template<class... Args> auto operator()(Args&&... args) & -> decltype( !std::declval<std::invoke_result_t<std::decay_t<F>&, Args...>>()); template<class... Args> auto operator()(Args&&... args) const& -> decltype( !std::declval<std::invoke_result_t<std::decay_t<F> const&, Args...>>()); |
(desde C++17) (hasta C++20) |
|
template<class... Args> constexpr auto operator()(Args&&... args) & noexcept(/*véase abajo*/) -> decltype( !std::declval<std::invoke_result_t<std::decay_t<F>&, Args...>>()); template<class... Args> constexpr auto operator()(Args&&... args) const& noexcept(/*véase abajo*/) -> decltype( !std::declval<std::invoke_result_t<std::decay_t<F> const&, Args...>>()); |
(desde C++20) | |
| (2) | ||
template<class... Args> auto operator()(Args&&... args) && -> decltype( !std::declval<std::invoke_result_t<std::decay_t<F>, Args...>>()); template<class... Args> auto operator()(Args&&... args) const&& -> decltype( !std::declval<std::invoke_result_t<std::decay_t<F> const, Args...>>()); |
(desde C++17) (hasta C++20) |
|
template<class... Args> constexpr auto operator()(Args&&... args) && noexcept(/*véase abajo*/) -> decltype( !std::declval<std::invoke_result_t<std::decay_t<F>, Args...>>()); template<class... Args> constexpr auto operator()(Args&&... args) const&& noexcept(/*véase abajo*/) -> decltype( !std::declval<std::invoke_result_t<std::decay_t<F> const, Args...>>()); |
(desde C++20) | |
|
1) Equivalente a
return !std::invoke(fd, std::forward<Args>(args)...);2) Equivalente a return !std::invoke(std::move(fd), std::forward<Args>(args)...);
|
(desde C++17) (hasta C++20) |
|
1) Equivalente en expresión a
!std::invoke(fd, std::forward<Args>(args)...)2) Equivalente en expresión a !std::invoke(std::move(fd), std::forward<Args>(args)...)
|
(desde C++20) |
donde fd es el objeto miembro de tipo std::decay_t<F>
Equivalente en expresión
La expresión e es equivalente-en-expresión a la expresión f, si e y f tienen los mismos efectos, ambas potencialmente lanzan o ambas potencialmente no lanzan (es decir, noexcept (e) == noexcept(f)), y ambas son subexpresiones constantes o ambas no son subexpresiones constantes.
Excepciones
No lanza excepciones, a menos que que la construcción de fd lance.
Posible implementación
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) };
}
|
Notas
Se pretende que not_fn reemplace los negadores de los tiempos de C++03, std::not1 y std::not2.
| Macro de Prueba de característica |
|---|
__cpp_lib_not_fn
|
Ejemplo
| Esta sección está incompleta Razón: sin ejemplo |
Véase también
(en desuso en C++17)(eliminado en C++20) |
Construye un objeto std::unary_negate personalizado. (plantilla de función) |
(en desuso en C++17)(eliminado en C++20) |
Construye un objeto std::binary_negate personalizado. (plantilla de función) |