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...)>; 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 могут хранить и вызывать любые конструируемые объекты (не обязательно должны быть конструируемыми для перемещения) Callable цели -- функции, лямбда-выражения, выражения привязки или другие объекты-функции, а также указатели на функции-элементы и указатели на объекты-элементы.
Сохранённый вызываемый объект называется целью класса std::move_only_function. Если std::move_only_function не содержит цели, он называется пустым. В отличие от std::function, вызов пустого std::move_only_function приводит к неопределённому поведению.
std::move_only_function поддерживает все возможные комбинации cv-квалификаторов, ссылочных-квалификаторов и noexcept-квалификаторов не включая volatile, указанных в его параметре шаблона. Эти квалификаторы и спецификатор (если есть) добавляются к его operator().
std::move_only_function соответствует требованиям MoveConstructible и MoveAssignable, но не соответствует CopyConstructible или CopyAssignable.
Типы элементы
| Тип | Определение |
result_type
|
R
|
Функции-элементы
(C++23) |
создаёт новый объект std::move_only_function (public функция-элемент) |
(C++23) |
уничтожает объект std::move_only_function (public функция-элемент) |
(C++23) |
заменяет или уничтожает цель (public функция-элемент) |
(C++23) |
меняет местами цели двух объектов std::move_only_function (public функция-элемент) |
(C++23) |
проверяет, есть ли у std::move_only_function цель (public функция-элемент) |
(C++23) |
вызывает цель (public функция-элемент) |
Функции, не являющиеся элементами
| перегружает алгоритм 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.
| Макрос Тестирования функциональности | Значение | Стандарт | Функциональность |
|---|---|---|---|
__cpp_lib_move_only_function |
202110L |
(C++23) | std::move_only_function
|
Пример
#include <iostream>
#include <functional>
#include <future>
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) |
обёртывает вызываемый объект любого конструируемого копированием типа с указанной сигнатурой вызова функции (шаблон класса) |