Spec-Zone.ru › C++

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
(публичная функция-член)
operator=
(C++23)
заменяет или уничтожает целевой объект
(публичная функция-член)
swap
(C++23)
меняет местами целевые объекты двух объектов std::move_only_function
(публичная функция-член)
operator bool
(C++23)
проверяет наличие целевого объекта в std::move_only_function
(публичная функция-член)
operator()
(C++23)
вызывает целевой объект
(публичная функция-член)

Функции вне класса

swap(std::move_only_function)
(C++23)
перегрузка алгоритма std::swap
(функция)
operator==
(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

См. также

function
(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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API