Пространства имён
Варианты
Действия

std::move_only_function::move_only_function

Материал из cppreference.com
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (базовые типы, RTTI)
Макросы тестирования функциональности библиотеки (C++20)    
Управление динамической памятью
Программные утилиты
Поддержка сопрограмм (C++20)
Вариативные функции
Трёхстороннее сравнение (C++20)
(C++20)
(C++20)(C++20)(C++20)(C++20)(C++20)(C++20)
Общие утилиты
Дата и время
Функциональные объекты
Библиотека форматирования (C++20)
(C++11)
Операторы отношения (устарело в 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++17)
 
Объекты функции
Функции обёртки
(C++11)
(C++11)
Применение частичных функций
(C++20)(C++23)
(C++11)
Вызов функции
(C++17)(C++23)
Объект идентичности функции
(C++20)
Обёртки ссылок
(C++11)(C++11)
Прозрачные обёртки операторов
(C++14)
(C++14)
(C++14)
(C++14)  
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)

Отрицатели
(C++17)
Искатели
Ограниченные компараторы
Старые привязки и адаптеры
(до 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*)
 
 
<tbody> </tbody>
move_only_function() noexcept;
(1) (начиная с C++23)
move_only_function( std::nullptr_t ) noexcept;
(2) (начиная с C++23)
move_only_function( move_only_function&& other ) noexcept;
(3) (начиная с C++23)
move_only_function( const move_only_function& ) = delete;
(4) (начиная с C++23)
template< class F > move_only_function( F&& f );
(5) (начиная с C++23)
template< class T, class... CArgs > explicit move_only_function( std::in_place_type_t<T>, CArgs&&... args );
(6) (начиная с C++23)
template< class T, class U, class... CArgs > explicit move_only_function( std::in_place_type_t<T>, std::initializer_list<U> il, CArgs&&... args );
(7) (начиная с C++23)

Создаёт новый std::move_only_function.

1,2) Конструктор по умолчанию и конструктор, принимающий nullptr, создают пустой std::move_only_function.
3) Конструктор перемещения создаёт std::move_only_function, целью которого является other. После создания перемещением other находится в допустимом, но неопределённом состоянии.
4) Конструктор копирования удалён. std::move_only_function не соответствует CopyConstructible.
5) Пусть VT будет std::decay_t<F>. Если f является нулевым указателем на функцию, нулевым указателем на значение элемента или пустым std::move_only_function (может быть любой специализацией), то создаётся пустой std::move_only_function. Иначе создаётся std::move_only_function, цель которого имеет тип VT и инициализируется напрямую, не используя список, с помощью std::forward<F>(f).
  • Эта перегрузка участвует в разрешении перегрузки, только если VT не совпадает с move_only_function и не является специализацией std::in_place_type_t, а /*можно вызвать из*/<VT> (смотрите ниже) равно true.
  • Программа некорректна, если std::is_constructible_v<VT, F> не равно true.
6) Пусть VT будет std::decay_t<T>. Создаёт std::move_only_function, цель которого имеет тип VT и инициализируется непосредственно без списка с помощью std::forward<CArgs>(args)....
  • Эта перегрузка участвует в разрешении перегрузки, только если both std::is_constructible_v<VT, CArgs...> и /*можно вызвать из*/<VT> (смотрите ниже) являются true.
  • Программа некорректна, если VT не того же типа, что и T.
7) Пусть VT будет std::decay_t<T>. Создаёт std::move_only_function, целевой объект которого имеет тип VT и инициализируется непосредственно без списка с помощью il, std::forward<CArgs>(args)....
  • Эта перегрузка участвует в разрешении перегрузки, только если оба std::is_constructible_v<VT, std::initializer_list<U>&, CArgs...> и /*можно вызвать из*/<VT> (смотрите ниже) равны true.
  • Программа некорректна, если VT не того же типа, что и T.

Для конструкторов (5-7) поведение не определено, если VT не соответствует требованиям Destructible или std::is_move_constructible_v<VT> равно true, но VT не соответствует требованиям MoveConstructible.

Константа /*можно вызвать из*/<VT> зависит от cv, ref и noex в шаблонном параметре объекта std::move_only_function, как показано ниже:

cv ref noexcept(noex) /*можно вызвать из*/<VT>
noexcept(false) std::is_invocable_r_v<R, VT, Args...> && std::is_invocable_r_v<R, VT&, Args...>
noexcept(true) std::is_nothrow_invocable_r_v<R, VT, Args...> && std::is_nothrow_invocable_r_v<R, VT&, Args...>
const noexcept(false) std::is_invocable_r_v<R, const VT, Args...> && std::is_invocable_r_v<R, const VT&, Args...>
const noexcept(true) std::is_nothrow_invocable_r_v<R, const VT, Args...> && std::is_nothrow_invocable_r_v<R, const VT&, Args...>
& noexcept(false) std::is_invocable_r_v<R, VT&, Args...>
& noexcept(true) std::is_nothrow_invocable_r_v<R, VT&, Args...>
const & noexcept(false) std::is_invocable_r_v<R, const VT&, Args...>
const & noexcept(true) std::is_nothrow_invocable_r_v<R, const VT&, Args...>
&& noexcept(false) std::is_invocable_r_v<R, VT, Args...>
&& noexcept(true) std::is_nothrow_invocable_r_v<R, VT, Args...>
const && noexcept(false) std::is_invocable_r_v<R, const VT, Args...>
const && noexcept(true) std::is_nothrow_invocable_r_v<R, const VT, Args...>

Параметры

other другой std::move_only_function для перемещения
f функция или Callable объект для обёртывания
args аргументы для создания целевого объекта
il std::initializer_list для создания целевого объекта

Исключения

5-7) Могут генерировать std::bad_alloc при сбое выделения памяти или распространять исключение, вызванное инициализацией цели. Исключение не генерируется, если VT является типом указателя на функцию или специализацией std::reference_wrapper.

Пример

Смотрите также

создаёт новый экземпляр std::function
(public функция-элемент std::function<R(Args...)>) [править]