close
Пространства имён
Варианты
Действия

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

Материал из cppreference.com
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (базовые типы, RTTI)
Макросы тестирования функциональности библиотеки (C++20)    
Управление динамической памятью
Программные утилиты
Поддержка сопрограмм (C++20)
Вариативные функции
Трёхстороннее сравнение (C++20)
(C++20)
(C++20)(C++20)(C++20)(C++20)(C++20)(C++20)
Общие утилиты
Дата и время
Функциональные объекты
Библиотека форматирования (C++20)
(C++11)
Операторы отношения (устарело в C++20)
Целочисленные функции сравнения
(C++20)(C++20)(C++20)    
(C++20)
Операции обмена и типа
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Общие лексические типы
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
Элементарные преобразования строк
(C++17)
(C++17)
 
Объекты функции
Функции обёртки
(C++11)
(C++11)
Применение частичных функций
(C++20)(C++23)
(C++11)
Вызов функции
(C++17)(C++23)
Объект идентичности функции
(C++20)
Обёртки ссылок
(C++11)(C++11)
Прозрачные обёртки операторов
(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)

Отрицатели
(C++17)
Искатели
Ограниченные компараторы
Старые привязки и адаптеры
(до 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*)
 
 
<tbody> </tbody> <tbody class="t-dcl-rev t-dcl-rev-num "> </tbody><tbody> </tbody>
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) Создаёт пустую функцию.
3,4) Копирует (3) или перемещает (4) цель объекта other в цель объекта *this. Если other пустой, *this после вызова будет тоже пустым. Для (4), other после вызова находится в допустимом, но неопределённом состоянии.
5) Инициализирует цель с помощью std::forward<F>(f). Цель имеет тип std::decay<F>::type. Если f является нулевым указателем на функцию, нулевым указателем на элемент или пустым значением некоторой специализации std::function, *this после вызова будет пустым. Этот конструктор не участвует в разрешении перегрузки, если целевой тип не совпадает с function, а его lvalue равно Callable для типов аргументов Args... и возвращаемого типа R. Программа некорректна, если целевой тип не является копируемым или инициализация цели некорректна.
6-10) То же, что и (1-5), за исключением того, что alloc используется для выделения памяти для любых внутренних структур данных, которые может использовать function.

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

Параметры

other объект function, используемый для инициализации *this
f вызываемый объект, используемый для инициализации *this
alloc Allocator, используемый для выделения внутренней памяти
Требования к типам
-
std::decay<F>::type должен соответствовать требованиям Callable и CopyConstructible.
-
Alloc должен соответствовать требованиям Allocator.

Исключения

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

Примечание

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

Пример

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

Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:

Номер Применён Поведение в стандарте Корректное поведение
LWG 2132 C++11 конструктор, принимающий объект Callable, может быть неоднозначным ограничено
LWG 2774 C++11 конструктор, принимающий Callable, выполнял дополнительное перемещение устранено

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

создаёт новый объект std::move_only_function
(public функция-элемент std::move_only_function) [править]