Namespaces
Variants

std::function<R(Args...)>::function

De es.cppreference.net
 
 
Biblioteca de utilidades
Soporte del lenguaje
Soporte de tipos (tipos básicos, RTTI)
Macros de prueba de características de la biblioteca (C++20)
Utilidades de programa
Funciones variádicas
Soporte de corrutinas (C++20)
Soporte de contratos (C++26)
Comparación tripartita
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

Utilidades generales
Operadores relacionales (obsoleto en C++20)
 
Objetos función
Invocación de función
(C++17)(C++23)
Objeto función identidad
(C++20)
Envoltorios de operadores transparentes
(C++14)
(C++14)
(C++14)
(C++14)  
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)

Antiguos enlazadores y adaptadores
(hasta C++17*)
(hasta C++17*)
(hasta C++17*)
(hasta C++17*)  
(hasta C++17*)
(hasta C++17*)(hasta C++17*)(hasta C++17*)(hasta C++17*)
(hasta C++20*)
(hasta C++20*)
(hasta C++17*)(hasta C++17*)
(hasta C++17*)(hasta C++17*)

(hasta C++17*)
(hasta C++17*)(hasta C++17*)(hasta C++17*)(hasta C++17*)
(hasta C++20*)
(hasta C++20*)
 
 
function() noexcept;
(1) (desde C++11)
function( std::nullptr_t ) noexcept;
(2) (desde C++11)
function( const function& other );
(3) (desde C++11)
function( function&& other );
(4) (desde C++11)
(hasta C++20)
function( function&& other ) noexcept;
(desde C++20)
template< class F > 
function( F&& f );
(5) (desde C++11)
template< class Alloc > 
function( std::allocator_arg_t, const Alloc& alloc ) noexcept;
(6) (desde C++11)
(eliminado en C++17)
template< class Alloc > 
function( std::allocator_arg_t, const Alloc& alloc, 
          std::nullptr_t ) noexcept;
(7) (desde C++11)
(eliminado en C++17)
template< class Alloc > 
function( std::allocator_arg_t, const Alloc& alloc, 
          const function& other );
(8) (desde C++11)
(eliminado en C++17)
template< class Alloc > 
function( std::allocator_arg_t, const Alloc& alloc, 
          function&& other );
(9) (desde C++11)
(eliminado en C++17)
template< class F, class Alloc > 
function( std::allocator_arg_t, const Alloc& alloc, F f );
(10) (desde C++11)
(eliminado en C++17)

Construye un std::function a partir de una variedad de fuentes.

1,2) Crea un vacío std::function.
3) Copia el objetivo de other al objetivo de *this.
Si other está vacío, *this también estará vacío justo después de la llamada.
4) Mueve el objetivo de other al objetivo de *this.
Si other está vacío, *this estará vacío justo después de la llamada.
other está en un estado válido pero no especificado justo después de la llamada.
5) Inicializa el objetivo con std::forward<F>(f). El objetivo es de tipo std::decay<F>::type.
Si f es un puntero nulo a función, un puntero nulo a miembro, o un valor vacío de alguna especialización de std::function, *this estará vacío justo después de la llamada.
Esta sobrecarga participa en la resolución de sobrecarga solo si se cumplen todas las siguientes condiciones:
  • std::is_same_v<std::remove_cvref_t<F>, std::function<R(Args...)> es false.
(desde C++23)
  • Un valor l de tipo std::decay<F>::type es invocable para los tipos de argumento Args... y el tipo de retorno R.

Si std::is_copy_constructible_v<std::decay_t<F>> o std::is_constructible_v<std::decay_t<F>, F> es false, el programa está mal formado.

(desde C++23)
Si F no es CopyConstructible, el comportamiento no está definido.
6-10) Igual que (1-5) excepto que alloc se utiliza para asignar memoria para cualquier estructura de datos interna que std::function pudiera usar.

Cuando el objetivo es un puntero a función o un std::reference_wrapper, se garantiza la optimización de objetos pequeños, es decir, estos objetivos siempre se almacenan directamente dentro del objeto std::function, no se produce ninguna asignación dinámica. Otros objetos grandes pueden construirse en almacenamiento asignado dinámicamente y ser accedidos por el objeto std::function a través de un puntero.

Parámetros

other - el objeto función utilizado para inicializar * this
f - un objeto invocable utilizado para inicializar * this
alloc - un Allocator utilizado para la asignación interna de memoria
Requisitos de tipo
-
Alloc debe cumplir con los requisitos de Allocator .

Excepciones

3,8,9) No lanza excepciones si other tiene como objetivo un puntero a función o un std::reference_wrapper , de lo contrario puede lanzar std::bad_alloc o cualquier excepción lanzada por el constructor utilizado para copiar o mover el objeto invocable almacenado.
4) No lanza excepciones si other tiene como destino un puntero a función o un std::reference_wrapper , de lo contrario puede lanzar std::bad_alloc o cualquier excepción lanzada por el constructor utilizado para copiar o mover el objeto invocable almacenado.
(until C++20)
5,10) No lanza excepciones si f es un puntero a función o un std::reference_wrapper , de lo contrario puede lanzar std::bad_alloc o cualquier excepción lanzada por el constructor de copia del objeto invocable almacenado.

Notas

std::function tenía un soporte de asignadores mal especificado e implementado de manera inconsistente. Algunas implementaciones no proporcionan las sobrecargas ( 6-10 ) en absoluto, algunas proporcionan las sobrecargas pero ignoran el argumento del asignador suministrado, y algunas proporcionan las sobrecargas y utilizan el asignador suministrado para la construcción pero no cuando el std::function es reasignado. Como resultado, el soporte de asignadores fue eliminado en C++17.

Ejemplo

#include <functional>
#include <iostream>
#include <utility>
void print_num(int i) { std::cout << "print_num(" << i << ")\n"; }
int main()
{
    std::function<void(int)> func1; // (1) constructor vacío
    try
    {
        func1(333 << 1);
    {
    catch (const std::bad_function_call& ex)
    {
        std::cout << "1) " << ex.what() << '\n';
    }
    std::function<void(int)> func2{nullptr}; // (2) constructor vacío
    try
    {
        func1(222 * 3);
    {
    catch (const std::bad_function_call& ex)
    {
        std::cout << "2) " << ex.what() << '\n';
    }
    func1 = print_num; // inicializa func1 usando operador de asignación
    std::function<void(int)> func3{func1}; // (3) constructor de copia
    func3(33);
    std::function<void(int)> func4{std::move(func3)}; // (4) constructor de movimiento,
                                                      // func3 en estado no especificado
    func4(44);
    std::function<void(int)> func5{print_num}; // (5) constructor con función
    func5(55);
    // (5) constructor con lambda
    std::function<void(int)> func6([](int i) { std::cout << "lambda(" << i << ")\n"; });
    func6(66);
}

Salida posible:

1) bad_function_call
2) bad_function_call
print_num(33)
print_num(44)
print_num(55)
lambda(66)

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 2132 C++11 las sobrecargas ( 5,10 ) podrían ser ambiguas restringidas
LWG 2774 C++11 ( 5,10 ) realizaba un movimiento adicional eliminado

Véase también

construye un nuevo objeto std::move_only_function
(función miembro pública de std::move_only_function )