Namespaces
Variants

std::move_only_function

Со ru.cppreference.net
 
 
Библиотека утилит
Поддержка языка
Поддержка типов (основные типы, RTTI)
Макросы проверки возможностей библиотеки (C++20)
Утилиты программы
Функции с переменным числом аргументов
Поддержка корутин (C++20)
Поддержка контрактов (C++26)
Трёхстороннее сравнение
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

Общие утилиты
Операторы отношений (устарело в C++20)
Функции сравнения целых чисел
(C++20)(C++20)(C++20)    
(C++20)
Обмен и операции с типами
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Общеупотребительные типы-словари
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)



 
Функциональные объекты
Вызов функций
(C++17)(C++23)
Тождественный функциональный объект
(C++20)
Старые binder'ы и адапторы
(до C++17*)
(до C++17*)
(до C++17*)
(до C++17*)
(до C++17*)(до C++17*)(до C++17*)(до C++17*)
(до C++20*)
(до C++20*)
(до C++17*)(до C++17*)
(до C++17*)(до C++17*)

(до C++17*)
(до C++17*)(до C++17*)(до C++17*)(до C++17*)
(до C++20*)
(до C++20*)
 
 
Определён в заголовке <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 целевой объект
(публичная функция-член)
вызывает целевой объект
(публичная функция-член)

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

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