std::function<R(Args...)>::function — cppreference.com
<tbody> </tbody> <tbody class="t-dcl-rev t-dcl-rev-num "> </tbody><tbody> </tbody>
|
|
(1) | (начиная с C++11) |
|
|
(2) | (начиная с C++11) |
|
|
(3) | (начиная с C++11) |
| (4) | ||
|
|
(начиная с C++11) (до C++20) |
|
|
|
(начиная с C++20) | |
|
|
(5) | (начиная с C++11) |
|
|
(6) | (начиная с C++11) (удалено в C++17) |
|
|
(7) | (начиная с C++11) (удалено в C++17) |
|
|
(8) | (начиная с C++11) (удалено в C++17) |
|
|
(9) | (начиная с C++11) (удалено в C++17) |
|
|
(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, используемый для выделения внутренней памяти |
| Требования к типам | ||
- должен соответствовать требованиям Callable и CopyConstructible.
| ||
-Alloc должен соответствовать требованиям Allocator.
| ||
Исключения
3,8,9) Не генерирует исключение, если цель объекта other является указателем на функцию или std::reference_wrapper, иначе может сгенерировать std::bad_alloc или любое другое исключение, созданное конструктором, используемым для копирования или перемещения сохранённого вызываемого объекта.
|
4) Не генерирует исключение, если цель объекта |
(до 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) [править]
|