Namespaces
Variants

Standard library header <functional>

From cppreference.net
Standard library headers

Este encabezado es parte de la biblioteca de objetos función y proporciona la función hash estándar.

Contenidos

Espacios de nombres

placeholders (C++11) Proporciona marcadores de posición para los argumentos no vinculados en una expresión std::bind

Clases

Wrappers
(C++11)
envoltorio copiable de cualquier objeto invocable copiable
(plantilla de clase)
envoltorio de solo movimiento de cualquier objeto invocable que admita calificadores en una firma de llamada dada
(plantilla de clase)
envoltorio copiable de cualquier objeto invocable construible por copia que soporta calificadores en una firma de llamada dada
(plantilla de clase)
envoltorio no propietario de cualquier objeto invocable
(plantilla de clase)
(C++11)
crea un objeto función a partir de un puntero a miembro
(plantilla de función)
CopyConstructible y CopyAssignable envoltorio de referencia
(plantilla de clase)
obtener el tipo de referencia encapsulado en std::reference_wrapper
(plantilla de clase)
Clases auxiliares
la excepción lanzada al invocar un std::function vacío
(clase)
indica que un objeto es una expresión std::bind o puede ser utilizado como una
(plantilla de clase)
indica que un objeto es un marcador de posición estándar o puede usarse como tal
(plantilla de clase)
Operaciones aritméticas
objeto función que implementa x + y
(plantilla de clase)
objeto función que implementa x - y
(plantilla de clase)
objeto función que implementa x * y
(plantilla de clase)
objeto función que implementa x / y
(plantilla de clase)
objeto función que implementa x % y
(plantilla de clase)
objeto función que implementa - x
(plantilla de clase)
Comparaciones
objeto función que implementa x == y
(plantilla de clase)
objeto función que implementa x ! = y
(plantilla de clase)
objeto función que implementa x > y
(plantilla de clase)
objeto función que implementa x < y
(plantilla de clase)
objeto función que implementa x >= y
(plantilla de clase)
objeto función que implementa x <= y
(plantilla de clase)
Comparaciones restringidas por conceptos
objeto de función restringido que implementa x == y
(clase)
objeto función restringido que implementa x ! = y
(clase)
objeto de función restringido que implementa x > y
(clase)
objeto de función restringido que implementa x < y
(clase)
objeto de función restringido que implementa x >= y
(clase)
objeto de función restringido que implementa x <= y
(clase)
objeto de función restringido que implementa x <=> y
(clase)
Operaciones lógicas
objeto función que implementa x && y
(plantilla de clase)
objeto función que implementa x || y
(plantilla de clase)
objeto de función que implementa ! x
(plantilla de clase)
Operaciones bit a bit
objeto función que implementa x & y
(plantilla de clase)
objeto función que implementa x | y
(plantilla de clase)
objeto función que implementa x ^ y
(plantilla de clase)
(C++14)
objeto función que implementa ~x
(plantilla de clase)
Negadores
(C++17)
crea un objeto función que devuelve el complemento del resultado del objeto función que contiene
(plantilla de función)
Identidades
(C++20)
objeto función que devuelve su argumento sin cambios
(clase)
Buscadores
implementación del algoritmo de búsqueda de la biblioteca estándar de C++
(plantilla de clase)
Implementación del algoritmo de búsqueda Boyer-Moore
(plantilla de clase)
Implementación del algoritmo de búsqueda Boyer-Moore-Horspool
(plantilla de clase)
Hashing
(C++11)
objeto función hash
(plantilla de clase)
std::hash especializaciones para tipos fundamentales, de enumeración y punteros
(especialización de plantilla de clase)

Constantes

Definido en el espacio de nombres std::placeholders
marcadores de posición para los argumentos no vinculados en una expresión std::bind
(constante)

Funciones

(C++20) (C++23)
enlazar un número variable de argumentos, en orden, a un objeto de función
(plantilla de función)
(C++11)
enlaza uno o más argumentos a un objeto de función
(plantilla de función)
(C++11) (C++11)
crea un std::reference_wrapper con un tipo deducido de su argumento
(plantilla de función)
(C++17) (C++23)
invoca cualquier Callable objeto con los argumentos dados y posibilidad de especificar el tipo de retorno (desde C++23)
(plantilla de función)

Obsoleto en C++11 y eliminado en C++17

Base
(deprecated in C++11) (removed in C++17)
clase base de función unaria compatible con adaptadores
(plantilla de clase)
(deprecated in C++11) (removed in C++17)
clase base de función binaria compatible con adaptadores
(plantilla de clase)
Binders
(deprecated in C++11) (removed in C++17)
objeto función que contiene una función binaria y uno de sus argumentos
(plantilla de clase)
(deprecated in C++11) (removed in C++17)
vincula un argumento a una función binaria
(plantilla de función)
Function adaptors
(deprecated in C++11) (removed in C++17)
envoltorio compatible con adaptadores para un puntero a función unaria
(plantilla de clase)
(deprecated in C++11) (removed in C++17)
envoltorio compatible con adaptadores para un puntero a función binaria
(plantilla de clase)
(deprecated in C++11) (removed in C++17)
crea un envoltorio de objeto función compatible con adaptadores desde un puntero a función
(plantilla de función)
(deprecated in C++11) (removed in C++17)
envoltorio para un puntero a función miembro nularia o unaria, invocable con un puntero a objeto
(plantilla de clase)
(deprecated in C++11) (removed in C++17)
crea un envoltorio desde un puntero a función miembro, invocable con un puntero a objeto
(plantilla de función)
envoltorio para un puntero a función miembro nularia o unaria, invocable con una referencia a objeto
(plantilla de clase)
(deprecated in C++11) (removed in C++17)
crea un envoltorio desde un puntero a función miembro, invocable con una referencia a objeto
(plantilla de función)

Obsoleto en C++17 y eliminado en C++20

Negadores
(obsoleto en C++17) (eliminado en C++20)
objeto función contenedor que retorna el complemento del predicado unario que contiene
(plantilla de clase)
(obsoleto en C++17) (eliminado en C++20)
objeto función contenedor que retorna el complemento del predicado binario que contiene
(plantilla de clase)
(obsoleto en C++17) (eliminado en C++20)
construye objeto personalizado std::unary_negate
(plantilla de función)
(obsoleto en C++17) (eliminado en C++20)
construye objeto personalizado std::binary_negate
(plantilla de función)

Sinopsis

namespace std {
  // invoke
  template<class F, class... Args>
    constexpr invoke_result_t<F, Args...> invoke(F&& f, Args&&... args)
      noexcept(is_nothrow_invocable_v<F, Args...>);
  template<class R, class F, class... Args>
    constexpr R invoke_r(F&& f, Args&&... args)
      noexcept(is_nothrow_invocable_r_v<R, F, Args...>);
  // reference_wrapper
  template<class T> class reference_wrapper;
  template<class T> constexpr reference_wrapper<T> ref(T&) noexcept;
  template<class T> constexpr reference_wrapper<const T> cref(const T&) noexcept;
  template<class T> void ref(const T&&) = delete;
  template<class T> void cref(const T&&) = delete;
  template<class T>
    constexpr reference_wrapper<T> ref(reference_wrapper<T>) noexcept;
  template<class T>
    constexpr reference_wrapper<const T> cref(reference_wrapper<T>) noexcept;
  template<class T> struct unwrap_reference;
  template<class T> using unwrap_reference_t = typename unwrap_reference<T>::type;
  template<class T> struct unwrap_ref_decay;
  template<class T> using unwrap_ref_decay_t = typename unwrap_ref_decay<T>::type;
  // especializaciones relacionadas con common_reference
  template<class R, class T, template<class> class RQual, template<class> class TQual>
    requires /* ver abajo */
  struct basic_common_reference<R, T, RQual, TQual>;
  template<class T, class R, template<class> class TQual, template<class> class RQual>
    requires /* ver abajo */
  struct basic_common_reference<T, R, TQual, RQual>;
  // operaciones aritméticas
  template<class T = void> struct plus;
  template<class T = void> struct minus;
  template<class T = void> struct multiplies;
  template<class T = void> struct divides;
  template<class T = void> struct modulus;
  template<class T = void> struct negate;
  template<> struct plus<void>;
  template<> struct minus<void>;
  template<> struct multiplies<void>;
  template<> struct divides<void>;
  template<> struct modulus<void>;
  template<> struct negate<void>;
  // comparaciones
  template<class T = void> struct equal_to;
  template<class T = void> struct not_equal_to;
  template<class T = void> struct greater;
  template<class T = void> struct less;
  template<class T = void> struct greater_equal;
  template<class T = void> struct less_equal;
  template<> struct equal_to<void>;
  template<> struct not_equal_to<void>;
  template<> struct greater<void>;
  template<> struct less<void>;
  template<> struct greater_equal<void>;
  template<> struct less_equal<void>;
  // operaciones lógicas
  template<class T = void> struct logical_and;
  template<class T = void> struct logical_or;
  template<class T = void> struct logical_not;
  template<> struct logical_and<void>;
  template<> struct logical_or<void>;
  template<> struct logical_not<void>;
  // operaciones bit a bit
  template<class T = void> struct bit_and;
  template<class T = void> struct bit_or;
  template<class T = void> struct bit_xor;
  template<class T = void> struct bit_not;
  template<> struct bit_and<void>;
  template<> struct bit_or<void>;
  template<> struct bit_xor<void>;
  template<> struct bit_not<void>;
  // identidad
  struct identity;
  // plantilla de función not_fn
  template<class F> constexpr /* sin especificar */ not_fn(F&& f);
  // plantillas de función bind_front y bind_back
  template<class F, class... Args> constexpr /* sin especificar */ bind_front(F&&, Args&&...);
  template<class F, class... Args> constexpr /* sin especificar */ bind_back(F&&, Args&&...);
  // bind
  template<class T> struct is_bind_expression;
  template<class T>
    inline constexpr bool is_bind_expression_v = is_bind_expression<T>::valor;
  template<class T> struct is_placeholder;
  template<class T>
    inline constexpr int is_placeholder_v = is_placeholder<T>::valor;
  template<class F, class... BoundArgs>
    constexpr /* sin especificar */ bind(F&&, BoundArgs&&...);
  template<class R, class F, class... BoundArgs>
    constexpr /* sin especificar */ bind(F&&, BoundArgs&&...);
  namespace placeholders {
    // M es el número de placeholders definido por la implementación
    /* ver descripción */ _1;
    /* ver descripción */ _2;
               .
               .
               .
    /* ver descripción */ _M;
  }
  // adaptadores de funciones miembro
  template<class R, class T>
    constexpr /* sin especificar */ mem_fn(R T::*) noexcept;
  // envoltorios de funciones polimórficas
  class bad_function_call;
  template<class> class function; // no definido
  template<class R, class... ArgTypes> class function<R(ArgTypes...)>;
  template<class R, class... ArgTypes>
    void swap(function<R(ArgTypes...)>&, function<R(ArgTypes...)>&) noexcept;
  template<class R, class... ArgTypes>
    bool operator==(const function<R(ArgTypes...)>&, nullptr_t) noexcept;
  // envoltorio de solo movimiento
  template<class...> class move_only_function; // no definido
  template<class R, class... ArgTypes>
    class move_only_function<R(ArgTypes...) /*cv ref*/ noexcept(/*noex*/)>;
  // envoltorio copiable
  template<class...> class copyable_function; // no definido
  template<class R, class... ArgTypes>
    class copyable_function<R(ArgTypes...) /*cv ref*/ noexcept(/*noex*/)>;
  // envoltorio no propietario
  template<class...> class function_ref; // no definido
  template<class R, class... ArgTypes>
    class function_ref<R(ArgTypes...) /*cv*/ noexcept(/*noex*/)>;
  // buscadores
  template<class ForwardIter, class BinaryPredicate = equal_to<>>
    class default_searcher;
  template<class RandomAccessIter,
           class Hash = hash<typename iterator_traits<RandomAccessIter>::value_type>,
           class BinaryPredicate = equal_to<>>
    class boyer_moore_searcher;
  template<class RandomAccessIter,
           class Hash = hash<typename iterator_traits<RandomAccessIter>::value_type>,
           class BinaryPredicate = equal_to<>>
    class boyer_moore_horspool_searcher;
  // función hash plantilla primaria
  template<class T>
    struct hash;
  // comparaciones restringidas por conceptos
  struct compare_three_way;
  namespace ranges {
    struct equal_to;
    struct not_equal_to;
    struct greater;
    struct less;
    struct greater_equal;
    struct less_equal;
  }
  // exposición solamente
  template<class Fn, class... Args>
    concept /*callable*/ =
      requires (Fn&& fn, Args&&... args) {
        std::forward<Fn>(fn)(std::forward<Args>(args)...);
      };
  // exposición solamente
  template<class Fn, class... Args>
    concept /*nothrow-callable*/ =
      /*callable*/<Fn, Args...> &&
      requires (Fn&& fn, Args&&... args) {
        { std::forward<Fn>(fn)(std::forward<Args>(args)...) } noexcept;
      };
  // exposición solamente
  template<class Fn, class... Args>
    using /*call-result-t*/ = decltype(std::declval<Fn>()(std::declval<Args>()...));
  // exposición solamente
  template<const auto& T>
    using /*decayed-typeof*/ = decltype(auto(T));
}

Plantilla de clase std::reference_wrapper

namespace std {
  template<class T> class reference_wrapper {
  public:
    // tipos
    using type = T;
    // construir/copiar/destruir
    template<class U>
      constexpr reference_wrapper(U&&) noexcept(/* ver más abajo */);
    constexpr reference_wrapper(const reference_wrapper& x) noexcept;
    // asignación
    constexpr reference_wrapper& operator=(const reference_wrapper& x) noexcept;
    // acceso
    constexpr operator T& () const noexcept;
    constexpr T& get() const noexcept;
    // invocación
    template<class... ArgTypes>
      constexpr invoke_result_t<T&, ArgTypes...> operator()(ArgTypes&&...) const
        noexcept(is_nothrow_invocable_v<T&, ArgTypes...>);
    // comparación
    friend constexpr bool operator==(reference_wrapper, reference_wrapper);
    friend constexpr bool operator==(reference_wrapper, const T&);
    friend constexpr bool operator==(reference_wrapper, reference_wrapper<const T>);
    friend constexpr auto operator<=>(reference_wrapper, reference_wrapper);
    friend constexpr auto operator<=>(reference_wrapper, const T&);
    friend constexpr auto operator<=>(reference_wrapper, reference_wrapper<const T>);
  };
  // guías de deducción
  template<class T>
    reference_wrapper(T&) -> reference_wrapper<T>;
}

Plantilla de clase std::unwrap_reference

namespace std {
  template<class T>
    struct unwrap_reference;
}

Plantilla de clase std::unwrap_ref_decay

namespace std {
  template<class T>
    struct unwrap_ref_decay;
}

Plantilla de clase std::plus

namespace std {
  template<class T = void> struct plus {
    constexpr T operator()(const T& x, const T& y) const;
  };
  template<> struct plus<void> {
    template<class T, class U> constexpr auto operator()(T&& t, U&& u) const
      -> decltype(std::forward<T>(t) + std::forward<U>(u));
    using is_transparent = /* no especificado */;
  };
}

Plantilla de clase std::minus

namespace std {
  template<class T = void> struct minus {
    constexpr T operator()(const T& x, const T& y) const;
  };
  template<> struct minus<void> {
    template<class T, class U> constexpr auto operator()(T&& t, U&& u) const
      -> decltype(std::forward<T>(t) - std::forward<U>(u));
    using is_transparent = /* no especificado */;
  };
}

Plantilla de clase std::multiplies

namespace std {
  template<class T = void> struct multiplies {
    constexpr T operator()(const T& x, const T& y) const;
  };
  template<> struct multiplies<void> {
    template<class T, class U> constexpr auto operator()(T&& t, U&& u) const
      -> decltype(std::forward<T>(t) * std::forward<U>(u));
    using is_transparent = /* no especificado */;
  };
}

Plantilla de clase std::divides

namespace std {
  template<class T = void> struct divides {
    constexpr T operator()(const T& x, const T& y) const;
  };
  template<> struct divides<void> {
    template<class T, class U> constexpr auto operator()(T&& t, U&& u) const
      -> decltype(std::forward<T>(t) / std::forward<U>(u));
    using is_transparent = /* no especificado */;
  };
}

Plantilla de clase std::modulus

namespace std {
  template<class T = void> struct modulus {
    constexpr T operator()(const T& x, const T& y) const;
  };
  template<> struct modulus<void> {
    template<class T, class U> constexpr auto operator()(T&& t, U&& u) const
      -> decltype(std::forward<T>(t) % std::forward<U>(u));
    using is_transparent = /* no especificado */;
  };
}

Plantilla de clase std::negate

namespace std {
  template<class T = void> struct negate {
    constexpr T operator()(const T& x) const;
  };
  template<> struct negate<void> {
    template<class T> constexpr auto operator()(T&& t) const
      -> decltype(-std::forward<T>(t));
    using is_transparent = /* no especificado */;
  };
}

Plantilla de clase std::equal_to

namespace std {
  template<class T = void> struct equal_to {
    constexpr bool operator()(const T& x, const T& y) const;
  };
  template<> struct equal_to<void> {
    template<class T, class U> constexpr auto operator()(T&& t, U&& u) const
      -> decltype(std::forward<T>(t) == std::forward<U>(u));
    using is_transparent = /* no especificado */;
  };
}

Plantilla de clase std::not_equal_to

namespace std {
  template<class T = void> struct not_equal_to {
    constexpr bool operator()(const T& x, const T& y) const;
  };
  template<> struct not_equal_to<void> {
    template<class T, class U> constexpr auto operator()(T&& t, U&& u) const
      -> decltype(std::forward<T>(t) != std::forward<U>(u));
    using is_transparent = /* no especificado */;
  };
}

Plantilla de clase std::greater

namespace std {
  template<class T = void> struct greater {
    constexpr bool operator()(const T& x, const T& y) const;
  };
  template<> struct greater<void> {
    template<class T, class U> constexpr auto operator()(T&& t, U&& u) const
      -> decltype(std::forward<T>(t) > std::forward<U>(u));
    using is_transparent = /* no especificado */;
  };
}

Plantilla de clase std::less

namespace std {
  template<class T = void> struct less {
    constexpr bool operator()(const T& x, const T& y) const;
  };
  template<> struct less<void> {
    template<class T, class U> constexpr auto operator()(T&& t, U&& u) const
      -> decltype(std::forward<T>(t) < std::forward<U>(u));
    using is_transparent = /* no especificado */;
  };
}

Plantilla de clase std::greater_equal

namespace std {
  template<class T = void> struct greater_equal {
    constexpr bool operator()(const T& x, const T& y) const;
  };
  template<> struct greater_equal<void> {
    template<class T, class U> constexpr auto operator()(T&& t, U&& u) const
      -> decltype(std::forward<T>(t) >= std::forward<U>(u));
    using is_transparent = /* no especificado */;
  };
}

Plantilla de clase std::less_equal

namespace std {
  template<class T = void> struct less_equal {
    constexpr bool operator()(const T& x, const T& y) const;
  };
  template<> struct less_equal<void> {
    template<class T, class U> constexpr auto operator()(T&& t, U&& u) const
      -> decltype(std::forward<T>(t) <= std::forward<U>(u));
    using is_transparent = /* no especificado */;
  };
}

Clase std::compare_three_way

namespace std {
  struct compare_three_way {
    template<class T, class U>
    constexpr auto operator()(T&& t, U&& u) const;
    using is_transparent = /* no especificado */;
  };
}

Clase std::ranges::equal_to

namespace std::ranges {
  struct equal_to {
    template<class T, class U>
    constexpr bool operator()(T&& t, U&& u) const;
    using is_transparent = /* no especificado */;
  };
}

Clase std::ranges::not_equal_to

namespace std::ranges {
  struct not_equal_to {
    template<class T, class U>
    constexpr bool operator()(T&& t, U&& u) const;
    using is_transparent = /* no especificado */;
  };
}

Clase std::ranges::greater

namespace std::ranges {
  struct greater {
    template<class T, class U>
    constexpr bool operator()(T&& t, U&& u) const;
    using is_transparent = /* no especificado */;
  };
}

Clase std::ranges::less

namespace std::ranges {
  struct less {
    template<class T, class U>
    constexpr bool operator()(T&& t, U&& u) const;
    using is_transparent = /* no especificado */;
  };
}

Clase std::ranges::greater_equal

namespace std::ranges {
  struct greater_equal {
    template<class T, class U>
    constexpr bool operator()(T&& t, U&& u) const;
    using is_transparent = /* no especificado */;
  };
}

Clase std::ranges::less_equal

namespace std::ranges {
  struct less_equal {
    template<class T, class U>
    constexpr bool operator()(T&& t, U&& u) const;
    using is_transparent = /* no especificado */;
  };
}

Plantilla de clase std::logical_and

namespace std {
  template<class T = void> struct logical_and {
    constexpr bool operator()(const T& x, const T& y) const;
  };
  template<> struct logical_and<void> {
    template<class T, class U> constexpr auto operator()(T&& t, U&& u) const
      -> decltype(std::forward<T>(t) && std::forward<U>(u));
    using is_transparent = /* no especificado */;
  };
}

Plantilla de clase std::logical_or

namespace std {
  template<class T = void> struct logical_or {
    constexpr bool operator()(const T& x, const T& y) const;
  };
  template<> struct logical_or<void> {
    template<class T, class U> constexpr auto operator()(T&& t, U&& u) const
      -> decltype(std::forward<T>(t) || std::forward<U>(u));
    using is_transparent = /* no especificado */;
  };
}

Plantilla de clase std::logical_not

namespace std {
  template<class T = void> struct logical_not {
    constexpr bool operator()(const T& x) const;
  };
  template<> struct logical_not<void> {
    template<class T> constexpr auto operator()(T&& t) const
      -> decltype(!std::forward<T>(t));
    using is_transparent = /* no especificado */;
  };
}

Plantilla de clase std::bit_and

namespace std {
  template<class T = void> struct bit_and {
    constexpr T operator()(const T& x, const T& y) const;
  };
  template<> struct bit_and<void> {
    template<class T, class U> constexpr auto operator()(T&& t, U&& u) const
      -> decltype(std::forward<T>(t) & std::forward<U>(u));
    using is_transparent = /* no especificado */;
  };
}

Plantilla de clase std::bit_or

namespace std {
  template<class T = void> struct bit_or {
    constexpr T operator()(const T& x, const T& y) const;
  };
  template<> struct bit_or<void> {
    template<class T, class U> constexpr auto operator()(T&& t, U&& u) const
      -> decltype(std::forward<T>(t) | std::forward<U>(u));
    using is_transparent = /* no especificado */;
  };
}

Plantilla de clase std::bit_xor

namespace std {
  template<class T = void> struct bit_xor {
    constexpr T operator()(const T& x, const T& y) const;
  };
  template<> struct bit_xor<void> {
    template<class T, class U> constexpr auto operator()(T&& t, U&& u) const
      -> decltype(std::forward<T>(t) ^ std::forward<U>(u));
    using is_transparent = /* no especificado */;
  };
}

Plantilla de clase std::bit_not

namespace std {
  template<class T = void> struct bit_not {
    constexpr T operator()(const T& x) const;
  };
  template<> struct bit_not<void> {
    template<class T> constexpr auto operator()(T&& t) const
      -> decltype(~std::forward<T>(t));
    using is_transparent = /* no especificado */;
  };
}

Plantilla de clase std::identity

namespace std {
  struct identity {
    template<class T>
      constexpr T&& operator()(T&& t) const noexcept;
    using is_transparent = /* no especificado */;
  };
}

Plantilla de clase std::is_bind_expression

namespace std {
  template<class T> struct is_bind_expression;
}

Plantilla de clase std::is_placeholder

namespace std {
  template<class T> struct is_placeholder;
}

Clase std::bad_function_call

namespace std {
  class bad_function_call : public exception {
  public:
    // ver [exception] para la especificación de las funciones miembro especiales
    const char* what() const noexcept override;
  };
}

Plantilla de clase std::function

namespace std {
  template<class> class function; // no definido
  template<class R, class... ArgTypes>
  class function<R(ArgTypes...)> {
  public:
    using result_type = R;
    // construcción/copia/destrucción
    function() noexcept;
    function(nullptr_t) noexcept;
    function(const function&);
    function(function&&) noexcept;
    template<class F> function(F);
    function& operator=(const function&);
    function& operator=(function&&);
    function& operator=(nullptr_t) noexcept;
    template<class F> function& operator=(F&&);
    template<class F> function& operator=(reference_wrapper<F>) noexcept;
    ~function();
    // modificadores de función
    void swap(function&) noexcept;
    // capacidad de función
    explicit operator bool() const noexcept;
    // invocación de función
    R operator()(ArgTypes...) const;
    // acceso al objetivo de función
    const type_info& target_type() const noexcept;
    template<class T>       T* target() noexcept;
    template<class T> const T* target() const noexcept;
  };
  template<class R, class... ArgTypes>
    function(R(*)(ArgTypes...)) -> function<R(ArgTypes...)>;
  template<class F> function(F) -> function</* ver descripción */>;
  // funciones de comparación con puntero nulo
  template<class R, class... ArgTypes>
    bool operator==(const function<R(ArgTypes...)>&, nullptr_t) noexcept;
  // algoritmos especializados
  template<class R, class... ArgTypes>
    void swap(function<R(ArgTypes...)>&, function<R(ArgTypes...)>&) noexcept;
}

Plantilla de clase std::move_only_function

namespace std {
  template<class... S> class move_only_function; // no definido
  template<class R, class... ArgTypes>
  class move_only_function<R(ArgTypes...) /*cv-ref*/ noexcept(/*noex*/)> {
  public:
    using result_type = R;
    // construcción/movimiento/destrucción
    move_only_function() noexcept;
    move_only_function(nullptr_t) noexcept;
    move_only_function(move_only_function&&) noexcept;
    template<class F> move_only_function(F&&);
    template<class T, class... Args>
      explicit move_only_function(in_place_type_t<T>, Args&&...);
    template<class T, class U, class... Args>
      explicit move_only_function(in_place_type_t<T>, initializer_list<U>, Args&&...);
    move_only_function& operator=(move_only_function&&);
    move_only_function& operator=(nullptr_t) noexcept;
    template<class F> move_only_function& operator=(F&&);
    ~move_only_function();
    // invocación
    explicit operator bool() const noexcept;
    R operator()(ArgTypes...) /*cv-ref*/ noexcept(/*noex*/);
    // utilidad
    void swap(move_only_function&) noexcept;
    friend void swap(move_only_function&, move_only_function&) noexcept;
    friend bool operator==(const move_only_function&, nullptr_t) noexcept;
  private:
    // solo para exposición
    template<class VT>
      static constexpr bool /*is-callable-from*/ = /* ver descripción */; 
  };
}

Plantilla de clase std::copyable_function

namespace std {
  template<class... S> class copyable_function; // no definido
  template<class R, class... ArgTypes>
  class copyable_function<R(ArgTypes...) /*cv-ref*/ noexcept(/*noex*/)> {
  public:
    using result_type = R;
    // construcción/movimiento/destrucción
    copyable_function() noexcept;
    copyable_function(nullptr_t) noexcept;
    copyable_function(const copyable_function&);
    copyable_function(copyable_function&&) noexcept;
    template<class F> copyable_function(F&&);
    template<class T, class... Args>
      explicit copyable_function(in_place_type_t<T>, Args&&...);
    template<class T, class U, class... Args>
      explicit copyable_function(in_place_type_t<T>, initializer_list<U>, Args&&...);
    copyable_function& operator=(const copyable_function&);
    copyable_function& operator=(copyable_function&&);
    copyable_function& operator=(nullptr_t) noexcept;
    template<class F> copyable_function& operator=(F&&);
    ~copyable_function();
    // invocación
    explicit operator bool() const noexcept;
    R operator()(ArgTypes...) /*cv-ref*/ noexcept(/*noex*/);
    // utilidad
    void swap(copyable_function&) noexcept;
    friend void swap(copyable_function&, copyable_function&) noexcept;
    friend bool operator==(const copyable_function&, nullptr_t) noexcept;
  private:
    // solo para exposición
    template<class VT>
      static constexpr bool /*is-callable-from*/ = /* ver descripción */; 
  };
}

Plantilla de clase std::function_ref

namespace std {
  template<class... S> class function_ref; // no definido
  template<class R, class... ArgTypes>
  class function_ref<R(ArgTypes...) /*cv*/ noexcept(/*noex*/)> {
  public:
    // constructores y operadores de asignación
    template<class F> function_ref(F*) noexcept;
    template<class F> constexpr function_ref(F&&) noexcept;
    template<auto f> constexpr function_ref(nontype_t<f>) noexcept;
    template<auto f, class U>
      constexpr function_ref(nontype_t<f>, U&&) noexcept;
    template<auto f, class T>
      constexpr function_ref(nontype_t<f>, /*cv*/ T*) noexcept;
    constexpr function_ref(const function_ref&) noexcept = default;
    constexpr function_ref& operator=(const function_ref&) noexcept = default;
    template<class T> function_ref& operator=(T) = delete;
    // invocación
    R operator()(ArgTypes...) /*cv*/ noexcept(/*noex*/);
  private:
    // solo para exposición
    template<class... T>
      static constexpr bool /*is-invocable-using*/ = /* ver descripción */;
    R (*thunk-ptr)(BoundEntityType, ArgTypes&&...) noexcept(/*noex*/); // solo para exposición
    BoundEntityType bound-entity; // solo para exposición
  };
  // guías de deducción
  template<class F>
    function_ref(F*) -> function_ref<F>;
  template<auto f>
    function_ref(nontype_t<f>) -> function_ref</* ver descripción */>;
  template<auto f, class T>
    function_ref(nontype_t<f>, T&&) -> function_ref</* ver descripción */>;
}

Plantilla de clase std::default_searcher

namespace std {
  template<class ForwardIter1, class BinaryPredicate = equal_to<>>
    class default_searcher {
    public:
      constexpr default_searcher(ForwardIter1 pat_first, ForwardIter1 pat_last,
                                 BinaryPredicate pred = BinaryPredicate());
      template<class ForwardIter2>
        constexpr pair<ForwardIter2, ForwardIter2>
          operator()(ForwardIter2 first, ForwardIter2 last) const;
    private:
      ForwardIter1 pat_first_;            // solo para exposición
      ForwardIter1 pat_last_;             // solo para exposición
      BinaryPredicate pred_;              // solo para exposición
  };
}

Plantilla de clase std::boyer_moore_searcher

namespace std {
  template<class RandomAccessIter1,
           class Hash = hash<typename iterator_traits<RandomAccessIter1>::value_type>,
           class BinaryPredicate = equal_to<>>
    class boyer_moore_searcher {
    public:
      boyer_moore_searcher(RandomAccessIter1 pat_first,
                           RandomAccessIter1 pat_last,
                           Hash hf = Hash(),
                           BinaryPredicate pred = BinaryPredicate());
      template<class RandomAccessIter2>
        pair<RandomAccessIter2, RandomAccessIter2>
          operator()(RandomAccessIter2 first, RandomAccessIter2 last) const;
    private:
      RandomAccessIter1 pat_first_;       // solo para exposición
      RandomAccessIter1 pat_last_;        // solo para exposición
      Hash hash_;                         // solo para exposición
      BinaryPredicate pred_;              // solo para exposición
    };
}

Plantilla de clase std::boyer_moore_horspool_searcher

namespace std {
  template<class RandomAccessIter1,
           class Hash = hash<typename iterator_traits<RandomAccessIter1>::value_type>,
           class BinaryPredicate = equal_to<>>
    class boyer_moore_horspool_searcher {
    public:
      boyer_moore_horspool_searcher(RandomAccessIter1 pat_first,
                                    RandomAccessIter1 pat_last,
                                    Hash hf = Hash(),
                                    BinaryPredicate pred = BinaryPredicate());
      template<class RandomAccessIter2>
        pair<RandomAccessIter2, RandomAccessIter2>
          operator()(RandomAccessIter2 first, RandomAccessIter2 last) const;
    private:
      RandomAccessIter1 pat_first_;       // solo para exposición
      RandomAccessIter1 pat_last_;        // solo para exposición
      Hash hash_;                         // solo para exposición
      BinaryPredicate pred_;              // solo para exposición
  };
}

Véase también

std::hash especializaciones para tipos de biblioteca