Namespaces
Variants

std:: move_only_function

From cppreference.net
Utilities library
Function objects
Function wrappers
(C++11)
move_only_function
(C++23)
(C++11)
Function invocation
(C++17) (C++23)
Identity function object
(C++20)
Old binders and adaptors
( until C++17* )
( until C++17* )
( until C++17* )
( until C++17* )
( until C++17* ) ( until C++17* ) ( until C++17* ) ( until C++17* )
( until C++20* )
( until C++20* )
( until C++17* ) ( until C++17* )
( until C++17* ) ( until C++17* )

( until C++17* )
( until C++17* ) ( until C++17* ) ( until C++17* ) ( until C++17* )
( until C++20* )
( until C++20* )
(Примечание: В данном фрагменте HTML отсутствует текстовое содержимое для перевода - присутствуют только HTML-теги и атрибуты, которые согласно инструкциям не подлежат переводу)
Определено в заголовке <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 целевой объект — функции, лямбда-выражения , 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 целевой объект
(публичная функция-член)
вызывает целевой объект
(публичная функция-член)

Функции, не являющиеся членами класса

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