Namespaces
Variants

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

From cppreference.net
Utilities library
Function objects
Function invocation
(C++17) (C++23)
Identity function object
(C++20)
Old binders and adaptors
( until C++17* )
( until C++17* )
( until C++17* )
( until C++17* )
( until C++17* ) ( until C++17* ) ( until C++17* ) ( until C++17* )
( until C++20* )
( until C++20* )
( until C++17* ) ( until C++17* )
( until C++17* ) ( until C++17* )

( until C++17* )
( until C++17* ) ( until C++17* ) ( until C++17* ) ( until C++17* )
( until C++20* )
( until C++20* )
function ( ) noexcept ;
(1) (начиная с C++11)
function ( std:: nullptr_t ) noexcept ;
(2) (начиная с C++11)
function ( const function & other ) ;
(3) (начиная с C++11)
(4)
function ( function && other ) ;
(начиная с C++11)
(до C++20)
function ( function && other ) noexcept ;
(начиная с C++20)
template < class F >
function ( F && f ) ;
(5) (начиная с C++11)
template < class Alloc >
function ( std:: allocator_arg_t , const Alloc & alloc ) noexcept ;
(6) (начиная с C++11)
(удалено в C++17)
template < class Alloc >

function ( std:: allocator_arg_t , const Alloc & alloc,

std:: nullptr_t ) noexcept ;
(7) (начиная с C++11)
(удалено в C++17)
template < class Alloc >

function ( std:: allocator_arg_t , const Alloc & alloc,

const function & other ) ;
(8) (начиная с C++11)
(удалено в C++17)
template < class Alloc >

function ( std:: allocator_arg_t , const Alloc & alloc,

function && other ) ;
(9) (начиная с C++11)
(удалено в C++17)
template < class F, class Alloc >
function ( std:: allocator_arg_t , const Alloc & alloc, F f ) ;
(10) (начиная с C++11)
(удалено в C++17)

Создает объект std::function из различных источников.

1,2) Создает пустой std::function .
3) Копирует целевой объект из other в целевой объект * this .
Если other пуст, * this также будет пуст сразу после вызова.
4) Перемещает целевой объект other в целевой объект * this .
Если other пуст, * this также будет пустым сразу после вызова.
other находится в допустимом, но неуказанном состоянии сразу после вызова.
5) Инициализирует целевой объект с помощью std:: forward < F > ( f ) . Целевой объект имеет тип std:: decay < F > :: type .
Если f является нулевым указателем на функцию, нулевым указателем на член или пустым значением специализации std::function , * this будет пустым сразу после вызова.
Эта перегрузка участвует в разрешении перегрузки только при выполнении всех следующих условий:
(начиная с C++23)
  • Lvalue типа std:: decay < F > :: type является вызываемым для типов аргументов Args... и типа возвращаемого значения R .

Если std:: is_copy_constructible_v < std:: decay_t < F >> или std:: is_constructible_v < std:: decay_t < F > , F > является false , программа является некорректной.

(начиная с C++23)
Если F не является CopyConstructible , поведение не определено.
6-10) То же, что и (1-5) за исключением того, что alloc используется для выделения памяти для любых внутренних структур данных, которые std::function может использовать.

Когда целевым объектом является указатель на функцию или std::reference_wrapper , гарантируется оптимизация малых объектов, то есть эти целевые объекты всегда хранятся непосредственно внутри объекта std::function , без выполнения динамического выделения памяти. Другие крупные объекты могут создаваться в динамически выделяемой памяти и доступны объекту std::function через указатель.

Содержание

Параметры

other - функциональный объект, используемый для инициализации * this
f - вызываемый объект, используемый для инициализации * this
alloc - аллокатор Allocator , используемый для внутреннего выделения памяти
Требования к типам
-
Alloc должен соответствовать требованиям Allocator .

Исключения

3,8,9) Не вызывает исключение, если other имеет целевой объект в виде указателя на функцию или std::reference_wrapper , в противном случае может вызвать std::bad_alloc или любое исключение, выброшенное конструктором, используемым для копирования или перемещения хранимого вызываемого объекта.
4) Не генерирует исключение, если other содержит указатель на функцию или std::reference_wrapper , в противном случае может генерировать std::bad_alloc или любое исключение, выброшенное конструктором, используемым для копирования или перемещения хранимого вызываемого объекта.
(until C++20)
5,10) Не вызывает исключений, если f является указателем на функцию или std::reference_wrapper , в противном случае может выбросить std::bad_alloc или любое исключение, выброшенное конструктором копирования сохраняемого вызываемого объекта.

Примечания

std::function имела плохо специфицированную и непоследовательно реализованную поддержку аллокаторов. Некоторые реализации вообще не предоставляют перегрузки ( 6-10 ) , некоторые предоставляют перегрузки, но игнорируют переданный аргумент аллокатора, а некоторые предоставляют перегрузки и используют переданный аллокатор для конструирования, но не при повторном присваивании std::function . В результате поддержка аллокаторов была удалена в C++17.

Пример

#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) пустой конструктор
    try
    {
        func1(333 << 1);
    }
    catch (const std::bad_function_call& ex)
    {
        std::cout << "1) " << ex.what() << '\n';
    }
    std::function<void(int)> func2{nullptr}; // (2) пустой конструктор
    try
    {
        func1(222 * 3);
    }
    catch (const std::bad_function_call& ex)
    {
        std::cout << "2) " << ex.what() << '\n';
    }
    func1 = print_num; // инициализация func1 с использованием оператора присваивания
    std::function<void(int)> func3{func1}; // (3) конструктор копирования
    func3(33);
    std::function<void(int)> func4{std::move(func3)}; // (4) конструктор перемещения,
                                                      // func3 в неопределенном состоянии
    func4(44);
    std::function<void(int)> func5{print_num}; // (5) конструктор с функцией
    func5(55);
    // (5) конструктор с лямбдой
    std::function<void(int)> func6([](int i) { std::cout << "lambda(" << i << ")\n"; });
    func6(66);
}

Возможный вывод:

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

Отчеты о дефектах

Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Applied to Behavior as published Correct behavior
LWG 2132 C++11 overloads ( 5,10 ) might be ambiguous constrained
LWG 2774 C++11 ( 5,10 ) performed an additional move eliminated

Смотрите также

создаёт новый объект std::move_only_function
(публичная функция-член std::move_only_function )