std::move_only_function
Определено в заголовке <functional> | ||
|---|---|---|
template< class... > class move_only_function; // not defined | (1) | (с C++23) |
template< class R, class... Args > class move_only_function<R(Args...)>; template< class R, class... Args > class move_only_function<R(Args...) noexcept>; template< class R, class... Args > class move_only_function<R(Args...) &>; template< class R, class... Args > class move_only_function<R(Args...) & noexcept>; template< class R, class... Args > class move_only_function<R(Args...) &&>; template< class R, class... Args > class move_only_function<R(Args...) && noexcept>; template< class R, class... Args > class move_only_function<R(Args...) const>; template< class R, class... Args > class move_only_function<R(Args...) const noexcept>; template< class R, class... Args > class move_only_function<R(Args...) const &>; template< class R, class... Args > class move_only_function<R(Args...) const & noexcept>; template< class R, class... Args > class move_only_function<R(Args...) const &&>; template< class R, class... Args > class move_only_function<R(Args...) const && noexcept>; | (2) | (с C++23) |
Шаблон класса std::move_only_function — это универсальная полиморфная обёртка функции. Объекты std::move_only_function могут хранить и вызывать любой конструктируемый (не обязательно сдвигаемо конструктируемый) Вызываемый объект целевой объект — функции, лямбда-выражения, выражения bind или другие объекты функций, а также указатели на члены-функции и указатели на члены-объекты.
Хранимый вызываемый объект называется целевым объектом std::move_only_function. Если std::move_only_function не содержит целевого объекта, он называется пустым. В отличие от std::function, вызов пустого std::move_only_function приводит к неопределённому поведению.
std::move_only_function поддерживает все возможные комбинации квалификаторов cv, квалификаторов ref и спецификаторов noexcept, за исключением volatile , указанных в параметре шаблона. Эти квалификаторы и спецификатор (если таковой имеется) добавляются к его operator().
std::move_only_function удовлетворяет требованиям MoveConstructible и MoveAssignable, но не удовлетворяет CopyConstructible или CopyAssignable.
Типы членов
| Тип | Определение |
|---|---|
result_type | R |
Члены-функции
|
(C++23) | создаёт новый объект std::move_only_function (публичная функция-член) |
|
(C++23) | уничтожает объект std::move_only_function (публичная функция-член) |
|
(C++23) | заменяет или уничтожает целевой объект (публичная функция-член) |
|
(C++23) | меняет местами целевые объекты двух объектов std::move_only_function (публичная функция-член) |
|
(C++23) | проверяет наличие целевого объекта в std::move_only_function (публичная функция-член) |
|
(C++23) | вызывает целевой объект (публичная функция-член) |
Функции вне класса
|
(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 (включая лямбда-выражение без trailing-return-type), программа некорректна, поскольку привязка возвращаемой ссылки к временному объекту запрещена. См. также std::function Примечания.
| Макро-тест функции | Значение | Std | Функция |
|---|---|---|---|
__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); // Error
std::move_only_function<void()> function = std::move(lambda); // OK
function();
std::cout << future.get();
}Вывод:
3.14159
См. также
|
(C++11) | оборачивает вызываемый объект любого копируемо конструктируемого типа с указанной сигнатурой вызова функции (шаблон класса) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/utility/functional/move_only_function