# std::move_only_function

< cpp‎ | utility‎ | functional

定义于头文件 `<functional>` |  |
template< class... > class move_only_function; // 不定义 |  | (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>; |  | (C++23 起)

类模板 `std::move_only_function` 是通用的多态函数包装。 `std::move_only_function` 对象存储并调用任何可构造（不要求为可移动构造）的可调用 (Callable) 目标——函数、 lambda 表达式、 bind 表达式或其他函数对象，以及成员函数指针和成员对象指针。

称存储的可调用对象为 `std::move_only_function` 的目标。若 `std::move_only_function` 不含目标，则称之为空。不同于 std::function ，调用空的 `std::move_only_function` 导致未定义行为。

`std::move_only_functions` 支持在其模板形参中提供的不含 volatile 的每种 cv 限定符、引用限定符及 noexcept 说明符的组合。这些限定符与说明符（若存在）被添加到其 `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 特化要求，并且只能应用到 std::is_nothrow_move_constructible_v<T> 为 true 的类型 `T` 。

类似 std::function ，若 `R` 为能绑定到右值的引用类型，则 `std::move_only_function` 可能包装按值返回的函数对象，该情况下对这种 `std::move_only_function` 的调用始终返回悬垂引用。

    std::move_only_function<const int&() const> uf([]{ return 42; });
    int x = uf(); // 未定义行为： uf() 的结果为悬垂引用

### 示例

| 本节未完成 原因：暂无示例

### 参阅

function (C++11) | 包装具有指定函数调用签名的任意可复制构造类型的可调用对象 (类模板)