std::move_only_function::move_only_function
Материал из cppreference.com
<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 находится в допустимом, но неопределённом состоянии.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...)>)
|