std:: move_only_function
|
Определено в заголовке
<functional>
|
||
|
template
<
class
...
>
class move_only_function ; // не определено |
(1) | (начиная с C++23) |
|
template
<
class
R,
class
...
Args
>
class
move_only_function
<
R
(
Args...
)
>
;
|
(2) | (начиная с C++23) |
Шаблон класса
std::move_only_function
является универсальным полиморфным обёрткой для функций.
Объекты
std::move_only_function
могут хранить и вызывать любой конструируемый (не обязательно перемещаемый)
Callable
целевой объект
— функции,
лямбда-выражения
,
bind-выражения
, или другие функциональные объекты, а также указатели на методы класса и указатели на члены данных.
Сохраненный вызываемый объект называется
целевым объектом
для
std::move_only_function
. Если
std::move_only_function
не содержит целевого объекта, он называется
пустым
. В отличие от
std::function
, вызов
пустого
std::move_only_function
приводит к неопределенному поведению.
std::move_only_function
поддерживает все возможные комбинации
cv-квалификаторов
(не включая
volatile
),
ref-квалификаторов
и
спецификаторов noexcept
, указанных в его шаблонном параметре. Эти квалификаторы и спецификатор (если есть) добавляются к его
operator()
.
std::move_only_function
удовлетворяет требованиям
MoveConstructible
и
MoveAssignable
, но не удовлетворяет
CopyConstructible
или
CopyAssignable
.
Содержание |
Типы членов
| Тип | Определение |
result_type
|
R
|
Функции-члены
создает новый объект
std::move_only_function
(публичная функция-член) |
|
уничтожает объект
std::move_only_function
(публичная функция-член) |
|
|
заменяет или уничтожает целевой объект
(публичная функция-член) |
|
обменивает целевые объекты двух
std::move_only_function
(публичная функция-член) |
|
проверяет, имеет ли
std::move_only_function
целевой объект
(публичная функция-член) |
|
|
вызывает целевой объект
(публичная функция-член) |
Функции, не являющиеся членами класса
|
(C++23)
|
специализирует алгоритм
std::swap
(функция) |
|
(C++23)
|
сравнивает
std::move_only_function
с
nullptr
(функция) |
Примечания
Реализации могут хранить вызываемый объект небольшого размера внутри объекта
std::move_only_function
. Такая оптимизация малых объектов фактически обязательна для указателей на функции и специализаций
std::reference_wrapper
, и может применяться только к типам
T
, для которых
std::
is_nothrow_move_constructible_v
<
T
>
равно
true
.
Если
std::move_only_function
, возвращающая ссылку, инициализируется из функции или функционального объекта, возвращающего prvalue (включая лямбда-выражение без завершающего возвращаемого типа), программа некорректна, поскольку привязка возвращаемой ссылки к временному объекту запрещена. См. также
std::function
Notes.
| Макрос тестирования возможностей | Значение | Стандарт | Функция |
|---|---|---|---|
__cpp_lib_move_only_function
|
202110L
|
(C++23) |
std::move_only_function
|
Пример
#include <functional> #include <future> #include <iostream> int main() { std::packaged_task<double()> packaged_task([](){ return 3.14159; }); std::future<double> future = packaged_task.get_future(); auto lambda = [task = std::move(packaged_task)]() mutable { task(); }; // std::function<void()> function = std::move(lambda); // Ошибка std::move_only_function<void()> function = std::move(lambda); // OK function(); std::cout << future.get(); }
Вывод:
3.14159
Смотрите также
|
(C++11)
|
копируемая обёртка любого копируемого вызываемого объекта
(шаблон класса) |
|
(C++26)
|
невладеющая обёртка любого вызываемого объекта
(шаблон класса) |
|
(C++26)
|
копируемая обёртка любого копируемого вызываемого объекта, поддерживающего квалификаторы в заданной сигнатуре вызова
(шаблон класса) |