std::function<R(Args...)>::function
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 из различных источников.
other в цель объекта *this. Если other пустой, *this после вызова будет тоже пустым. Для (4), other после вызова находится в допустимом, но неопределённом состоянии.std::forward<F>(f). Цель имеет тип std::decay<F>::type. Если f является нулевым указателем на функцию, нулевым указателем на элемент или пустым значением некоторой специализации std::function, *this после вызова будет пустым. Этот конструктор не участвует в разрешении перегрузки, если целевой тип не совпадает с function, а его lvalue равно Callable для типов аргументов Args... и возвращаемого типа R. Программа некорректна, если целевой тип не является копируемым или инициализация цели некорректна.alloc используется для выделения памяти для любых внутренних структур данных, которые может использовать function.Когда целью является указатель на функцию или std::reference_wrapper, оптимизация малых объектов гарантируется, то есть эти цели всегда хранятся непосредственно внутри объекта std::function, динамическое размещение не происходит. Другие большие объекты могут быть созданы в динамически выделенной памяти и доступны для объекта std::function через указатель.
Параметры
| other | — | объект function, используемый для инициализации *this
|
| f | — | вызываемый объект, используемый для инициализации *this
|
| alloc | — | Allocator, используемый для выделения внутренней памяти |
| Требования к типам | ||
- должен соответствовать требованиям Callable и CopyConstructible.
| ||
-Alloc должен соответствовать требованиям Allocator.
| ||
Исключения
other является указателем на функцию или std::reference_wrapper, иначе может сгенерировать std::bad_alloc или любое другое исключение, созданное конструктором, используемым для копирования или перемещения сохранённого вызываемого объекта.|
4) Не генерирует исключение, если цель объекта
other является указателем на функцию или std::reference_wrapper, иначе может сгенерировать std::bad_alloc или любое другое исключение, созданное конструктором, используемым для копирования или перемещения сохранённого вызываемого объекта. |
(до C++20) |
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, выполнял дополнительное перемещение | устранено |
Смотрите также
(C++23) |
создаёт новый объект std::move_only_function (public функция-элемент std::move_only_function)
|