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-квалификаторов (кроме 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)
|
копируемая обёртка любого копируемого вызываемого объекта, поддерживающего квалификаторы в заданной сигнатуре вызова
(шаблон класса) |