Namespaces
Variants

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

От ru.cppreference.net
 
 
Библиотека утилит
Поддержка языка
Поддержка типов (базовые типы, RTTI)
Макросы проверки возможностей библиотеки (C++20)
Утилиты программ
Функции с переменным числом аргументов
Поддержка корутин (C++20)
Поддержка контрактов (C++26)
Трёхстороннее сравнение
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

Общие утилиты
Операторы отношений (устарело в C++20)
 
Объекты-функции
Вызов функций
(C++17)(C++23)
Тождественный объект-функция
(C++20)
Старые binder'ы и адапторы
(до C++17*)
(до C++17*)
(до C++17*)
(до C++17*)
(до C++17*)(до C++17*)(до C++17*)(до C++17*)
(до C++20*)
(до C++20*)
(до C++17*)(до C++17*)
(до C++17*)(до C++17*)

(до C++17*)
(до C++17*)(до C++17*)(до C++17*)(до C++17*)
(до C++20*)
(до C++20*)
 
 
function() noexcept;
(1) (начиная с C++11)
function( std::nullptr_t ) noexcept;
(2) (начиная с C++11)
function( const function& other );
(3) (начиная с C++11)
function( function&& other );
(4) (начиная с 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 будет пустым сразу после вызова.
Эта перегрузка участвует в разрешении перегрузки только если выполнены все следующие условия:
  • std::is_same_v<std::remove_cvref_t<F>, std::function<R(Args...)> является false.
(начиная с 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 )