跳到主要内容

10. utilities (工具组件)

包含各种通用的工具组件。头文件: <utility>, <tuple>, <functional>, <memory>。

10.1 utility​


template <class T> T&& forward(typename remove_reference<T>::type& t) noexcept

完美转发。

  • 输入: t
  • 输出: T&&
  • 注意: 必须显式指定模板参数

template <class T> typename remove_reference<T>::type&& move(T&&) noexcept

强制转右值引用。

  • 输入: 任何值
  • 输出: 右值引用
  • 注意: 不移动数据,仅转换值类别

template <class T> void swap(T& a, T& b)

交换。

  • 输入: a, b
  • 输出: void

template <class T, class U=T> constexpr T exchange(T& obj, U&& new_value)

替换并返回旧值。

  • 输入: obj, new_value
  • 输出: 旧值
  • 注意: C++14

10.2 pair​


template <class T1, class T2> struct pair

二元组。

  • 输入: T1, T2
  • 输出: pair 对象

pair<V1, V2> make_pair(T1&& x, T2&& y)

创建 pair。

  • 输入: x, y
  • 输出: pair 对象
  • 注意: 使用 decay 类型推导

10.3 tuple​


template <class... Types> class tuple

元组。

  • 输入: Types...
  • 输出: tuple 对象

template <class... Types> tuple<Types...> make_tuple(Types&&... args)

创建 tuple。

  • 输入: args...
  • 输出: tuple 对象

template <class... Types> tuple<Types&...> tie(Types&... args) noexcept

创建引用 tuple。

  • 输入: 左值引用
  • 输出: 引用 tuple

template <class... Tuples> auto tuple_cat(Tuples&&... tpls)

连接 tuple。

  • 输入: tuple 参数包
  • 输出: 合并后的 tuple

10.7 functional​


template <class T> class reference_wrapper

可复制引用的包装器。

  • 输入: T
  • 输出: 包装器对象

template <class T=void> struct plus / minus / multiplies / divides / modulus / negate

算术函数对象。

  • 输入: 两个 T
  • 输出: 运算结果

template <class T=void> struct equal_to / not_equal_to / greater / less / greater_equal / less_equal

比较函数对象。

  • 输入: 两个 T
  • 输出: bool

template <class Fn, class... BoundArgs> constexpr auto bind(Fn&& fn, BoundArgs&&... args)

绑定函数参数。

  • 输入: fn, args...
  • 输出: 绑定后的可调用对象

template <class R, class... ArgTypes> class function<R(ArgTypes...)>

类型擦除函数包装器。

  • 输入: 签名 R(Args...)
  • 输出: function 对象

explicit operator bool() const noexcept

检查是否非空。

  • 输入: 无
  • 输出: bool

class bad_function_call : public exception

空 function 调用异常。

  • 输入: 无
  • 输出: 异常对象

template <class T> struct hash

哈希函数对象。

  • 输入: T
  • 输出: size_t

10.8 memory​


template <class T, class D = default_delete<T>> class unique_ptr

独占所有权智能指针。

  • 输入: T, D
  • 输出: unique_ptr 对象
  • 注意: 不可复制,只可移动

pointer release() noexcept

释放所有权。

  • 输入: 无
  • 输出: pointer
  • 注意: 不删除对象

void reset(pointer p = pointer()) noexcept

重置。

  • 输入: p
  • 输出: void

template <class T, class... Args> unique_ptr<T> make_unique(Args&&... args)

创建 unique_ptr。

  • 输入: args...
  • 输出: unique_ptr<T>
  • 注意: C++14

注意:shared_ptr / weak_ptr / make_shared 在本交付配置下不可链接​

一致性测试结果:-frtti(clang 默认开关)下,任何使用 std::shared_ptr / std::weak_ptr / std::make_shared 的程序 链接失败 —— kf32ld: error: undefined symbol: typeinfo for std::__1::__shared_weak_count(最小复现可复现)。 交付库中未提供该 typeinfo 符号。详见 13.7.1 L1。

使用限制:本交付配置下不要使用 shared_ptr / weak_ptr / make_shared; 独占所有权请改用 unique_ptr(正常可用)。以下用法说明仅供了解接口,不代表当前可链接。

template <class T> class shared_ptr

共享所有权引用计数智能指针。

  • 输入: T
  • 输出: shared_ptr 对象

long use_count() const noexcept

获取引用计数。

  • 输入: 无
  • 输出: long

template <class T, class... Args> shared_ptr<T> make_shared(Args&&... args)

创建 shared_ptr。

  • 输入: args...
  • 输出: shared_ptr<T>

template <class T> class weak_ptr

弱引用指针。

  • 输入: T
  • 输出: weak_ptr 对象

shared_ptr<T> lock() const noexcept

提升为 shared_ptr。

  • 输入: 无
  • 输出: shared_ptr<T>

template <class T> class enable_shared_from_this

允许对象安全获取自身 shared_ptr。

  • 输入: T
  • 输出: 基类

template <class T> T* addressof(T& r) noexcept

获取真实地址。

  • 输入: r
  • 输出: T*

template <class InputIterator, class ForwardIterator> ForwardIterator uninitialized_copy(...)

复制到未初始化内存。

  • 输入: 源范围,目标
  • 输出: ForwardIterator