标准库标头 <memory>

来自cppreference.com
< cpp‎ | header
 
 
标准库标头
注:修订记号中的反斜杠 '/' 意味着此标头被弃用和/或被移除。
语言支持
概念
<concepts> (C++20)
诊断
<system_error> (C++11)
内存管理
<memory>
<memory_resource> (C++17)  
元编程
<type_traits> (C++11)
<ratio> (C++11)
通用工具
<utility>
<tuple> (C++11)
<optional> (C++17)
<variant> (C++17)
<any> (C++17)
<expected> (C++23)
<bitset>

<charconv> (C++17)
<format> (C++20)
<bit> (C++20)

字符串
<cuchar> (C++11)

容器
<flat_set> (C++23)
<span> (C++20)
<mdspan> (C++23)

迭代器
<iterator>
范围
<ranges> (C++20)
<generator> (C++23)
算法
数值
<cfenv> (C++11)
<complex>
<numbers> (C++20)

日期时间
<chrono> (C++11)
本地化
<codecvt> (C++11/17)
输入/输出
<filesystem> (C++17)
<cstdio>
<cinttypes> (C++11)
<strstream> (C++98/)
正则表达式
<regex>
并发支持
<stop_token> (C++20)
<thread> (C++11)
<atomic> (C++11)
<stdatomic.h> (C++23)
<mutex> (C++11)
<shared_mutex> (C++14)
<condition_variable> (C++11)  
<semaphore> (C++20)
<latch> (C++20)
<barrier> (C++20)
<future> (C++11)

C 兼容
<cstdbool> (C++11/17/20)  
<ccomplex> (C++11/17/20)
<ctgmath> (C++11/17/20)

<cstdalign> (C++11/17/20)

<ciso646> (C++20 前)

 

此头文件是动态内存管理库的一部分。

包含

(C++20)
三路比较运算符支持

指针特征
提供关于指针式类型的信息
(类模板)
垃圾收集器支持
(C++11)(C++23 中移除)
列出指针安全模式
(枚举)
分配器
默认的分配器
(类模板)
提供关于分配器类型的信息
(类模板)
记录由 allocate_at_least 分配的存储的地址与实际大小
(类模板)
标签类型,用于选择具分配器的构造函数重载
(类)
检查指定的类型是否支持使用分配器的构造
(类模板)
未初始化存储
(C++17 中弃用)(C++20 中移除)
允许标准算法存储结果于未初始化内存的迭代器
(类模板)
智能指针
拥有独有对象所有权语义的智能指针
(类模板)
拥有共享对象所有权语义的智能指针
(类模板)
(C++11)
std::shared_ptr 所管理对象的弱引用
(类模板)
(C++17 中移除)
拥有严格对象所有权语义的智能指针
(类模板)
辅助类
原子共享指针
(类模板特化)
原子弱指针
(类模板特化)
提供基于所有者的,共享指针和弱指针的混合类型的排序
(类模板)
允许对象创建指代自身的 shared_ptr
(类模板)
访问指向已销毁对象的 weak_ptr 时抛出的异常
(类)
unique_ptr 的默认删除器
(类模板)
std::unique_ptr 的散列支持
(类模板特化)
std::shared_ptr 的散列支持
(类模板特化)
智能指针适配器
(C++23)
与外来指针设置器交互,并在析构时重设智能指针
(类模板)
与外来指针设置器交互,从智能指针获得初始指针值,并在析构时重设它
(类模板)
前置声明
在标头 <functional> 定义
(C++11)
散列函数对象
(类模板)
在标头 <atomic> 定义
(C++11)
atomic 类模板及其针对布尔、整型和指针类型的特化
(类模板)

常量

用于选择具分配器的构造函数的 std::allocator_arg_t 对象
(常量)

函数

杂项
从指针式类型获得裸指针
(函数模板)
(C++11)
获得对象的实际地址,即使其重载了 & 运算符
(函数模板)
(C++11)
对齐缓冲区中的指针
(函数)
告知编译器指针已对齐
(函数模板)
垃圾收集器支持
(C++11)(C++23 中移除)
声明一个对象不能被回收
(函数)
(C++11)(C++23 中移除)
声明一个对象可以被回收
(函数模板)
(C++11)(C++23 中移除)
声明该内存区域不含可追踪指针
(函数)
(C++11)(C++23 中移除)
取消 std::declare_no_pointers 的效果
(函数)
(C++11)(C++23 中移除)
返回当前的指针安全模式
(函数)
未初始化存储
将范围内的对象复制到未初始化的内存区域
(函数模板)
将指定数量的对象复制到未初始化的内存区域
(函数模板)
复制一个对象到以范围定义的未初始化内存区域
(函数模板)
复制一个对象到以起点和计数定义的未初始化内存区域
(函数模板)
移动一个范围的对象到未初始化的内存区域
(函数模板)
移动一定数量对象到未初始化内存区域
(函数模板)
在范围所定义的未初始化的内存区域以默认初始化构造对象
(函数模板)
在起始和计数所定义的未初始化内存区域用默认初始化构造对象
(函数模板)
在范围所定义的未初始化内存中用值初始化构造对象
(函数模板)
在起始和计数所定义的未初始化内存区域以值初始化构造对象
(函数模板)
在给定地址创建对象
(函数模板)
销毁在给定地址的对象
(函数模板)
(C++17)
销毁一个范围中的对象
(函数模板)
(C++17)
销毁范围中一定数量的对象
(函数模板)
(C++17 中弃用)(C++20 中移除)
获得未初始化存储
(函数模板)
(C++17 中弃用)(C++20 中移除)
释放未初始化存储
(函数模板)
智能指针非成员操作
创建管理一个新对象的独占指针
(函数模板)
与另一个 unique_ptrnullptr 进行比较
(函数模板)
创建管理一个新对象的共享指针
(函数模板)
创建管理一个用分配器分配的新对象的共享指针
(函数模板)
应用 static_castdynamic_castconst_castreinterpret_cast 到被存储指针
(函数模板)
返回指定类型中的删除器,若其拥有
(函数模板)
(C++20 中移除)(C++20 中移除)(C++20 中移除)(C++20 中移除)(C++20 中移除)(C++20)
与另一个 shared_ptrnullptr 进行比较
(函数模板)
将存储的指针的值输出到输出流
(函数模板)
特化 std::swap 算法
(函数模板)
特化 std::swap 算法
(函数模板)
特化 std::swap 算法
(函数模板)
智能指针适配器创建
(C++23)
以关联的智能指针和重设参数创建 out_ptr_t
(函数模板)
(C++23)
以关联的智能指针和重设参数创建 inout_ptr_t
(函数模板)
特化的原子操作
(函数模板)

仿函数实体

在命名空间 std::ranges 定义
未初始化存储
复制元素范围到未初始化的内存区域
(niebloid)
复制一定量元素到未初始化的内存区域
(niebloid)
复制一个对象到范围所定义的未初始化的内存区域
(niebloid)
复制一个对象到起始与计数所定义的未初始化的内存区域
(niebloid)
移动对象范围到未初始化的内存区域
(niebloid)
移动一定量对象到未初始化的内存区域
(niebloid)
在范围所定义的未初始化的内存区域以默认初始化构造对象
(niebloid)
在起始与计数所定义的未初始化的内存区域以默认初始化构造对象
(niebloid)
在范围所定义的未初始化的内存区域以值初始化构造对象
(niebloid)
在起始与计数所定义的未初始化的内存区域以值初始化构造对象
(niebloid)
在给定地址创建对象
(niebloid)
销毁位于给定地址的元素
(niebloid)
销毁范围中的元素
(niebloid)
销毁范围中一定量的元素
(niebloid)

概要

#include <compare>
 
namespace std {
  // 指针特征
  template<class Ptr> struct pointer_traits;
  template<class T> struct pointer_traits<T*>;
 
  // 指针转换
  template<class T>
    constexpr T* to_address(T* p) noexcept;
  template<class Ptr>
    constexpr auto to_address(const Ptr& p) noexcept;
 
  // 指针对齐
  void* align(size_t alignment, size_t size, void*& ptr, size_t& space);
  template<size_t N, class T>
    [[nodiscard]] constexpr T* assume_aligned(T* ptr);
 
  // 分配器参数标签
  struct allocator_arg_t { explicit allocator_arg_t() = default; };
  inline constexpr allocator_arg_t allocator_arg{};
 
  // uses_­allocator
  template<class T, class Alloc> struct uses_allocator;
 
  // uses_­allocator
  template<class T, class Alloc>
    inline constexpr bool uses_allocator_v = uses_allocator<T, Alloc>::value;
 
  // 使用分配器构造
  template<class T, class Alloc, class... Args>
    constexpr auto uses_allocator_construction_args(const Alloc& alloc,
                                                    Args&&... args) noexcept;
  template<class T, class Alloc, class Tuple1, class Tuple2>
    constexpr auto uses_allocator_construction_args(const Alloc& alloc, piecewise_construct_t,
                                                    Tuple1&& x, Tuple2&& y) noexcept;
  template<class T, class Alloc>
    constexpr auto uses_allocator_construction_args(const Alloc& alloc) noexcept;
  template<class T, class Alloc, class U, class V>
    constexpr auto uses_allocator_construction_args(const Alloc& alloc,
                                                    U&& u, V&& v) noexcept;
  template<class T, class Alloc, class U, class V>
    constexpr auto uses_allocator_construction_args(const Alloc& alloc,
                                                    const pair<U, V>& pr) noexcept;
  template<class T, class Alloc, class U, class V>
    constexpr auto uses_allocator_construction_args(const Alloc& alloc,
                                                    pair<U, V>&& pr) noexcept;
  template<class T, class Alloc, class... Args>
    constexpr T make_obj_using_allocator(const Alloc& alloc, Args&&... args);
  template<class T, class Alloc, class... Args>
    constexpr T* uninitialized_construct_using_allocator(T* p, const Alloc& alloc,
                                                         Args&&... args);
 
  // 分配器特征
  template<class Alloc> struct allocator_traits;
 
  template<class Pointer, class SizeType = size_t>
  struct allocation_result {
    Pointer ptr;
    SizeType count;
  };
 
  // 默认分配器
  template<class T> class allocator;
  template<class T, class U>
    constexpr bool operator==(const allocator<T>&, const allocator<U>&) noexcept;
 
  // addressof
  template<class T>
    constexpr T* addressof(T& r) noexcept;
  template<class T>
    const T* addressof(const T&&) = delete;
 
  // 特化的算法
  // 特殊内存概念
  template<class I>
    concept no-throw-input-iterator = /* 见描述 */;    // 仅用于阐释
  template<class I>
    concept no-throw-forward-iterator = /* 见描述 */;  // 仅用于阐释
  template<class S, class I>
    concept no-throw-sentinel-for = /* 见描述 */;      // 仅用于阐释
  template<class R>
    concept no-throw-input-range = /* 见描述 */;       // 仅用于阐释
  template<class R>
    concept no-throw-forward-range = /* 见描述 */;     // 仅用于阐释
 
  template<class NoThrowForwardIt>
    void uninitialized_default_construct(NoThrowForwardIt first,
                                         NoThrowForwardIt last);
  template<class ExecutionPolicy, class NoThrowForwardIt>
    void uninitialized_default_construct(ExecutionPolicy&& exec,
                                         NoThrowForwardIt first,
                                         NoThrowForwardIt last);
  template<class NoThrowForwardIt, class Size>
    NoThrowForwardIt
      uninitialized_default_construct_n(NoThrowForwardIt first, Size n);
  template<class ExecutionPolicy, class NoThrowForwardIt, class Size>
    NoThrowForwardIt
      uninitialized_default_construct_n(ExecutionPolicy&& exec,
                                        NoThrowForwardIt first, Size n);
 
  namespace ranges {
    template<no-throw-forward-iterator I, no-throw-sentinel-for<I> S>
      requires default_­initializable<iter_value_t<I>>
        I uninitialized_default_construct(I first, S last);
    template<no-throw-forward-range R>
      requires default_­initializable<range_value_t<R>>
        borrowed_iterator_t<R> uninitialized_default_construct(R&& r);
 
    template<no-throw-forward-iterator I>
      requires default_­initializable<iter_value_t<I>>
        I uninitialized_default_construct_n(I first, iter_difference_t<I> n);
  }
 
  template<class NoThrowForwardIterator>
    void uninitialized_value_construct(NoThrowForwardIterator first,
                                       NoThrowForwardIterator last);
  template<class ExecutionPolicy, class NoThrowForwardIt>
    void uninitialized_value_construct(ExecutionPolicy&& exec,
                                       NoThrowForwardIt first,
                                       NoThrowForwardIt last);
  template<class NoThrowForwardIt, class Size>
    NoThrowForwardIt
      uninitialized_value_construct_n(NoThrowForwardIt first, Size n);
  template<class ExecutionPolicy, class NoThrowForwardIt, class Size>
    NoThrowForwardIt
      uninitialized_value_construct_n(ExecutionPolicy&& exec,
                                      NoThrowForwardIt first, Size n);
 
  namespace ranges {
    template<no-throw-forward-iterator I, no-throw-sentinel-for<I> S>
      requires default_­initializable<iter_value_t<I>>
        I uninitialized_value_construct(I first, S last);
    template<no-throw-forward-range R>
      requires default_­initializable<range_value_t<R>>
        borrowed_iterator_t<R> uninitialized_value_construct(R&& r);
 
    template<no-throw-forward-iterator I>
      requires default_­initializable<iter_value_t<I>>
        I uninitialized_value_construct_n(I first, iter_difference_t<I> n);
  }
 
  template<class InputIt, class NoThrowForwardIt>
    NoThrowForwardIt uninitialized_copy(InputIt first, InputIt last,
                                        NoThrowForwardIt result);
  template<class ExecutionPolicy, class ForwardIt, class NoThrowForwardIt>
    NoThrowForwardIt uninitialized_copy(ExecutionPolicy&& exec,
                                        ForwardIt first, ForwardIt last,
                                        NoThrowForwardIt result);
  template<class InputIt, class Size, class NoThrowForwardIt>
    NoThrowForwardIt uninitialized_copy_n(InputIt first, Size n,
                                          NoThrowForwardIt result);
  template<class ExecutionPolicy, class ForwardIt, class Size,
           class NoThrowForwardIt>
    NoThrowForwardIt uninitialized_copy_n(ExecutionPolicy&& exec,
                                          ForwardIt first, Size n,
                                          NoThrowForwardIt result);
 
  namespace ranges {
    template<class I, class O>
      using uninitialized_copy_result = in_out_result<I, O>;
    template<input_­iterator I, sentinel_­for<I> S1,
             no-throw-forward-iterator O, no-throw-sentinel-for<O> S2>
      requires constructible_­from<iter_value_t<O>, iter_reference_t<I>>
        uninitialized_copy_result<I, O>
          uninitialized_copy(I ifirst, S1 ilast, O ofirst, S2 olast);
    template<input_­range IR, no-throw-forward-range OR>
      requires constructible_­from<range_value_t<OR>, range_reference_t<IR>>
        uninitialized_copy_result<borrowed_iterator_t<IR>, borrowed_iterator_t<OR>>
          uninitialized_copy(IR&& in_range, OR&& out_range);
 
    template<class I, class O>
      using uninitialized_copy_n_result = in_out_result<I, O>;
    template<input_­iterator I, no-throw-forward-iterator O, no-throw-sentinel-for<O> S>
      requires constructible_­from<iter_value_t<O>, iter_reference_t<I>>
        uninitialized_copy_n_result<I, O>
          uninitialized_copy_n(I ifirst, iter_difference_t<I> n, O ofirst, S olast);
  }
 
  template<class InputIt, class NoThrowForwardIt>
    NoThrowForwardIt uninitialized_move(InputIt first, InputIt last,
                                        NoThrowForwardIt result);
  template<class ExecutionPolicy, class ForwardIt, class NoThrowForwardIt>
    NoThrowForwardIt uninitialized_move(ExecutionPolicy&& exec,
                                        ForwardIt first, ForwardIt last,
                                        NoThrowForwardIt result);
  template<class InputIt, class Size, class NoThrowForwardIt>
    pair<InputIt, NoThrowForwardIt>
      uninitialized_move_n(InputIt first, Size n, NoThrowForwardIt result);
  template<class ExecutionPolicy, class ForwardIt, class Size,
           class NoThrowForwardIt>
    pair<ForwardIt, NoThrowForwardIt>
      uninitialized_move_n(ExecutionPolicy&& exec,
                           ForwardIt first, Size n, NoThrowForwardIt result);
 
  namespace ranges {
    template<class I, class O>
      using uninitialized_move_result = in_out_result<I, O>;
    template<input_­iterator I, sentinel_­for<I> S1,
             no-throw-forward-iterator O, no-throw-sentinel-for<O> S2>
      requires constructible_­from<iter_value_t<O>, iter_rvalue_reference_t<I>>
        uninitialized_move_result<I, O>
          uninitialized_move(I ifirst, S1 ilast, O ofirst, S2 olast);
    template<input_­range IR, no-throw-forward-range OR>
      requires constructible_­from<range_value_t<OR>, range_rvalue_reference_t<IR>>
        uninitialized_move_result<borrowed_iterator_t<IR>, borrowed_iterator_t<OR>>
          uninitialized_move(IR&& in_range, OR&& out_range);
 
    template<class I, class O>
      using uninitialized_move_n_result = in_out_result<I, O>;
    template<input_­iterator I,
             no-throw-forward-iterator O, no-throw-sentinel-for<O> S>
      requires constructible_­from<iter_value_t<O>, iter_rvalue_reference_t<I>>
        uninitialized_move_n_result<I, O>
          uninitialized_move_n(I ifirst, iter_difference_t<I> n, O ofirst, S olast);
  }
 
  template<class NoThrowForwardIt, class T>
    void uninitialized_fill(NoThrowForwardIt first, NoThrowForwardIt last,
                            const T& x);
  template<class ExecutionPolicy, class NoThrowForwardIt, class T>
    void uninitialized_fill(ExecutionPolicy&& exec,
                            NoThrowForwardIt first, NoThrowForwardIt last,
                            const T& x);
  template<class NoThrowForwardIt, class Size, class T>
    NoThrowForwardIt
      uninitialized_fill_n(NoThrowForwardIt first, Size n, const T& x);
  template<class ExecutionPolicy, class NoThrowForwardIt, class Size, class T>
    NoThrowForwardIt
      uninitialized_fill_n(ExecutionPolicy&& exec,
                           NoThrowForwardIt first, Size n, const T& x);
 
  namespace ranges {
    template<no-throw-forward-iterator I, no-throw-sentinel-for<I> S, class T>
      requires constructible_­from<iter_value_t<I>, const T&>
        I uninitialized_fill(I first, S last, const T& x);
    template<no-throw-forward-range R, class T>
      requires constructible_­from<range_value_t<R>, const T&>
        borrowed_iterator_t<R> uninitialized_fill(R&& r, const T& x);
 
    template<no-throw-forward-iterator I, class T>
      requires constructible_­from<iter_value_t<I>, const T&>
        I uninitialized_fill_n(I first, iter_difference_t<I> n, const T& x);
  }
 
  // construct_­at
  template<class T, class... Args>
    constexpr T* construct_at(T* location, Args&&... args);
 
  namespace ranges {
    template<class T, class... Args>
      constexpr T* construct_at(T* location, Args&&... args);
  }
 
  // destroy
  template<class T>
    constexpr void destroy_at(T* location);
  template<class NoThrowForwardIt>
    constexpr void destroy(NoThrowForwardIt first, NoThrowForwardIt last);
  template<class ExecutionPolicy, class NoThrowForwardIt>
    void destroy(ExecutionPolicy&& exec,
                 NoThrowForwardIt first, NoThrowForwardIt last);
  template<class NoThrowForwardIt, class Size>
    constexpr NoThrowForwardIt destroy_n(NoThrowForwardIt first, Size n);
  template<class ExecutionPolicy, class NoThrowForwardIt, class Size>
    NoThrowForwardIt destroy_n(ExecutionPolicy&& exec,
                               NoThrowForwardIt first, Size n);
 
  namespace ranges {
    template<destructible T>
      constexpr void destroy_at(T* location) noexcept;
 
    template<no-throw-input-iterator I, no-throw-sentinel-for<I> S>
      requires destructible<iter_value_t<I>>
        constexpr I destroy(I first, S last) noexcept;
    template<no-throw-input-range R>
      requires destructible<range_value_t<R>>
        constexpr borrowed_iterator_t<R> destroy(R&& r) noexcept;
 
    template<no-throw-input-iterator I>
      requires destructible<iter_value_t<I>>
        constexpr I destroy_n(I first, iter_difference_t<I> n) noexcept;
  }
 
  // 类模板 unique_­ptr
  template<class T> struct default_delete;
  template<class T> struct default_delete<T[]>;
  template<class T, class D = default_delete<T>> class unique_ptr;
  template<class T, class D> class unique_ptr<T[], D>;
 
  template<class T, class... Args>
    unique_ptr<T> make_unique(Args&&... args);                                  // T 非数组
  template<class T>
    unique_ptr<T> make_unique(size_t n);                                        // T 为 U[]
  template<class T, class... Args>
    /* 未指明 */ make_unique(Args&&...) = delete;                                // T 为 U[N]
 
  template<class T>
    unique_ptr<T> make_unique_for_overwrite();                                  // T 非数组
  template<class T>
    unique_ptr<T> make_unique_for_overwrite(size_t n);                          // T 为 U[]
  template<class T, class... Args>
    /* 未指明 */ make_unique_for_overwrite(Args&&...) = delete;                  // T 为 U[N]
 
  template<class T, class D>
    void swap(unique_ptr<T, D>& x, unique_ptr<T, D>& y) noexcept;
 
  template<class T1, class D1, class T2, class D2>
    bool operator==(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y);
  template<class T1, class D1, class T2, class D2>
    bool operator<(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y);
  template<class T1, class D1, class T2, class D2>
    bool operator>(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y);
  template<class T1, class D1, class T2, class D2>
    bool operator<=(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y);
  template<class T1, class D1, class T2, class D2>
    bool operator>=(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y);
  template<class T1, class D1, class T2, class D2>
    requires three_­way_­comparable_­with<typename unique_ptr<T1, D1>::pointer,
                                       typename unique_ptr<T2, D2>::pointer>
    compare_three_way_result_t<typename unique_ptr<T1, D1>::pointer,
                               typename unique_ptr<T2, D2>::pointer>
      operator<=>(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y);
 
  template<class T, class D>
    bool operator==(const unique_ptr<T, D>& x, nullptr_t) noexcept;
  template<class T, class D>
    bool operator<(const unique_ptr<T, D>& x, nullptr_t);
  template<class T, class D>
    bool operator<(nullptr_t, const unique_ptr<T, D>& y);
  template<class T, class D>
    bool operator>(const unique_ptr<T, D>& x, nullptr_t);
  template<class T, class D>
    bool operator>(nullptr_t, const unique_ptr<T, D>& y);
  template<class T, class D>
    bool operator<=(const unique_ptr<T, D>& x, nullptr_t);
  template<class T, class D>
    bool operator<=(nullptr_t, const unique_ptr<T, D>& y);
  template<class T, class D>
    bool operator>=(const unique_ptr<T, D>& x, nullptr_t);
  template<class T, class D>
    bool operator>=(nullptr_t, const unique_ptr<T, D>& y);
  template<class T, class D>
    requires three_­way_­comparable<typename unique_ptr<T, D>::pointer>
    compare_three_way_result_t<typename unique_ptr<T, D>::pointer>
      operator<=>(const unique_ptr<T, D>& x, nullptr_t);
 
  template<class E, class T, class Y, class D>
    basic_ostream<E, T>& operator<<(basic_ostream<E, T>& os, const unique_ptr<Y, D>& p);
 
  // 类 bad_­weak_­ptr
  class bad_weak_ptr;
 
  // 类模板 shared_­ptr
  template<class T> class shared_ptr;
 
  // shared_­ptr 创建
  template<class T, class... Args>
    shared_ptr<T> make_shared(Args&&... args);                                  // T 非数组
  template<class T, class A, class... Args>
    shared_ptr<T> allocate_shared(const A& a, Args&&... args);                  // T 非数组
 
  template<class T>
    shared_ptr<T> make_shared(size_t N);                                        // T 为 U[]
  template<class T, class A>
    shared_ptr<T> allocate_shared(const A& a, size_t N);                        // T 为 U[]
 
  template<class T>
    shared_ptr<T> make_shared();                                                // T 为 U[N]
  template<class T, class A>
    shared_ptr<T> allocate_shared(const A& a);                                  // T 为 U[N]
 
  template<class T>
    shared_ptr<T> make_shared(size_t N, const remove_extent_t<T>& u);           // T 为 U[]
  template<class T, class A>
    shared_ptr<T> allocate_shared(const A& a, size_t N,
                                  const remove_extent_t<T>& u);                 // T 为 U[]
 
  template<class T>
    shared_ptr<T> make_shared(const remove_extent_t<T>& u);                     // T 为 U[N]
  template<class T, class A>
    shared_ptr<T> allocate_shared(const A& a, const remove_extent_t<T>& u);     // T 为 U[N]
 
  template<class T>
    shared_ptr<T> make_shared_for_overwrite();                                  // T 非 U[]
  template<class T, class A>
    shared_ptr<T> allocate_shared_for_overwrite(const A& a);                    // T 非 U[]
 
  template<class T>
    shared_ptr<T> make_shared_for_overwrite(size_t N);                          // T 为 U[]
  template<class T, class A>
    shared_ptr<T> allocate_shared_for_overwrite(const A& a, size_t N);          // T 为 U[]
 
  // shared_­ptr 比较
  template<class T, class U>
    bool operator==(const shared_ptr<T>& a, const shared_ptr<U>& b) noexcept;
  template<class T, class U>
    strong_ordering operator<=>(const shared_ptr<T>& a, const shared_ptr<U>& b) noexcept;
 
  template<class T>
    bool operator==(const shared_ptr<T>& x, nullptr_t) noexcept;
  template<class T>
    strong_ordering operator<=>(const shared_ptr<T>& x, nullptr_t) noexcept;
 
  // shared_­ptr 特化算法
  template<class T>
    void swap(shared_ptr<T>& a, shared_ptr<T>& b) noexcept;
 
  // shared_­ptr 转型
  template<class T, class U>
    shared_ptr<T> static_pointer_cast(const shared_ptr<U>& r) noexcept;
  template<class T, class U>
    shared_ptr<T> static_pointer_cast(shared_ptr<U>&& r) noexcept;
  template<class T, class U>
    shared_ptr<T> dynamic_pointer_cast(const shared_ptr<U>& r) noexcept;
  template<class T, class U>
    shared_ptr<T> dynamic_pointer_cast(shared_ptr<U>&& r) noexcept;
  template<class T, class U>
    shared_ptr<T> const_pointer_cast(const shared_ptr<U>& r) noexcept;
  template<class T, class U>
    shared_ptr<T> const_pointer_cast(shared_ptr<U>&& r) noexcept;
  template<class T, class U>
    shared_ptr<T> reinterpret_pointer_cast(const shared_ptr<U>& r) noexcept;
  template<class T, class U>
    shared_ptr<T> reinterpret_pointer_cast(shared_ptr<U>&& r) noexcept;
 
  // shared_­ptr get_­deleter
  template<class D, class T>
    D* get_deleter(const shared_ptr<T>& p) noexcept;
 
  // shared_­ptr I/O
  template<class E, class T, class Y>
    basic_ostream<E, T>& operator<<(basic_ostream<E, T>& os, const shared_ptr<Y>& p);
 
  // 类模板 weak_­ptr
  template<class T> class weak_ptr;
 
  // weak_­ptr 特化算法
  template<class T> void swap(weak_ptr<T>& a, weak_ptr<T>& b) noexcept;
 
  // 类模板 owner_­less
  template<class T = void> struct owner_less;
 
  // 类模板 enable_­shared_­from_­this
  template<class T> class enable_shared_from_this;
 
  // 散列支持
  template<class T> struct hash;
  template<class T, class D> struct hash<unique_ptr<T, D>>;
  template<class T> struct hash<shared_ptr<T>>;
 
  // 原子智能指针
  template<class T> struct atomic;
  template<class T> struct atomic<shared_ptr<T>>;
  template<class T> struct atomic<weak_ptr<T>>;
 
  // 类模板 out_­ptr_­t
  template<class Smart, class Pointer, class... Args>
    class out_ptr_t;
 
  // 函数模板 out_­ptr
  template<class Pointer = void, class Smart, class... Args>
    auto out_ptr(Smart& s, Args&&... args);
 
  // 类模板 inout_­ptr_­t
  template<class Smart, class Pointer, class... Args>
    class inout_ptr_t;
 
  // 函数模板 inout_­ptr
  template<class Pointer = void, class Smart, class... Args>
    auto inout_ptr(Smart& s, Args&&... args);
}
 
// 弃用
namespace std {
  template<class T>
    bool atomic_is_lock_free(const shared_ptr<T>* p);
 
  template<class T>
    shared_ptr<T> atomic_load(const shared_ptr<T>* p);
  template<class T>
    shared_ptr<T> atomic_load_explicit(const shared_ptr<T>* p, memory_order mo);
 
  template<class T>
    void atomic_store(shared_ptr<T>* p, shared_ptr<T> r);
  template<class T>
    void atomic_store_explicit(shared_ptr<T>* p, shared_ptr<T> r, memory_order mo);
 
  template<class T>
    shared_ptr<T> atomic_exchange(shared_ptr<T>* p, shared_ptr<T> r);
  template<class T>
    shared_ptr<T> atomic_exchange_explicit(shared_ptr<T>* p, shared_ptr<T> r, memory_order mo);
 
  template<class T>
    bool atomic_compare_exchange_weak(shared_ptr<T>* p, shared_ptr<T>* v, shared_ptr<T> w);
  template<class T>
    bool atomic_compare_exchange_strong(shared_ptr<T>* p, shared_ptr<T>* v, shared_ptr<T> w);
  template<class T>
    bool atomic_compare_exchange_weak_explicit(
      shared_ptr<T>* p, shared_ptr<T>* v, shared_ptr<T> w,
      memory_order success, memory_order failure);
  template<class T>
    bool atomic_compare_exchange_strong_explicit(
      shared_ptr<T>* p, shared_ptr<T>* v, shared_ptr<T> w,
      memory_order success, memory_order failure);
}

辅助概念

template<class I>
concept no-throw-input-iterator = // 仅用于阐释
  input_iterator<I> &&
  is_lvalue_reference_v<iter_reference_t<I>> &&
  same_as<remove_cvref_t<iter_reference_t<I>>, iter_value_t<I>>;
 
template<class S, class I>
concept no-throw-sentinel-for = sentinel_for<S, I>; // 仅用于阐释
 
template<class R>
concept no-throw-input-range = // 仅用于阐释
  ranges::range<R> &&
  no-throw-input-iterator<ranges::iterator_t<R>> &&
  no-throw-sentinel-for<ranges::sentinel_t<R>, ranges::iterator_t<R>>;
 
template<class I>
concept no-throw-forward-iterator = // 仅用于阐释
  no-throw-input-iterator<I> &&
  forward_iterator<I> &&
  no-throw-sentinel-for<I, I>;
 
template<class R>
concept no-throw-forward-range = // 仅用于阐释
  no-throw-input-range<R> &&
  no-throw-forward-iterator<ranges::iterator_t<R>>;

注意:这些名字仅用于阐释,它们不是接口的一部分。

类模板 std::pointer_traits

namespace std {
  template<class Ptr> struct pointer_traits {
    using pointer         = Ptr;
    using element_type    = /* 见描述 */;
    using difference_type = /* 见描述 */;
 
    template<class U> using rebind = /* 见描述 */;
 
    static pointer pointer_to(/* 见描述 */ r);
  };
 
  template<class T> struct pointer_traits<T*> {
    using pointer         = T*;
    using element_type    = T;
    using difference_type = ptrdiff_t;
 
    template<class U> using rebind = U*;
 
    static constexpr pointer pointer_to(/* 见描述 */ r) noexcept;
  };
}

std::allocator_arg_t

namespace std {
  struct allocator_arg_t { explicit allocator_arg_t() = default; };
  inline constexpr allocator_arg_t allocator_arg{};
}

类模板 std::allocator_traits

namespace std {
  template<class Alloc> struct allocator_traits {
    using allocator_type     = Alloc;
 
    using value_type         = typename Alloc::value_type;
 
    using pointer            = /* 见描述 */;
    using const_pointer      = /* 见描述 */;
    using void_pointer       = /* 见描述 */;
    using const_void_pointer = /* 见描述 */;
 
    using difference_type    = /* 见描述 */;
    using size_type          = /* 见描述 */;
 
    using propagate_on_container_copy_assignment = /* 见描述 */;
    using propagate_on_container_move_assignment = /* 见描述 */;
    using propagate_on_container_swap            = /* 见描述 */;
    using is_always_equal                        = /* 见描述 */;
 
    template<class T> using rebind_alloc = /* 见描述 */;
    template<class T> using rebind_traits = allocator_traits<rebind_alloc<T>>;
 
    [[nodiscard]] static pointer allocate(Alloc& a, size_type n);
    [[nodiscard]] static pointer allocate(Alloc& a, size_type n,
                                          const_void_pointer hint);
 
    [[nodiscard]] static constexpr allocation_result<pointer, size_type>
        allocate_at_least(Alloc& a, size_type n);
 
    static void deallocate(Alloc& a, pointer p, size_type n);
 
    template<class T, class... Args>
      static void construct(Alloc& a, T* p, Args&&... args);
 
    template<class T>
      static void destroy(Alloc& a, T* p);
 
    static size_type max_size(const Alloc& a) noexcept;
 
    static Alloc select_on_container_copy_construction(const Alloc& rhs);
  };
}

类模板 std::allocator

namespace std {
  template<class T> class allocator {
   public:
    using value_type                             = T;
    using size_type                              = size_t;
    using difference_type                        = ptrdiff_t;
    using propagate_on_container_move_assignment = true_type;
 
    constexpr allocator() noexcept;
    constexpr allocator(const allocator&) noexcept;
    template<class U> constexpr allocator(const allocator<U>&) noexcept;
    constexpr ~allocator();
    constexpr allocator& operator=(const allocator&) = default;
 
    [[nodiscard]] constexpr T* allocate(size_t n);
    [[nodiscard]] constexpr allocation_result<T*> allocate_at_least(size_t n);
    constexpr void deallocate(T* p, size_t n);
 
    // 弃用
    using is_always_equal = true_type;
  };
}

类模板 std::default_delete

namespace std {
  template<class T> struct default_delete {
    constexpr default_delete() noexcept = default;
    template<class U> default_delete(const default_delete<U>&) noexcept;
    void operator()(T*) const;
  };
 
  template<class T> struct default_delete<T[]> {
    constexpr default_delete() noexcept = default;
    template<class U> default_delete(const default_delete<U[]>&) noexcept;
    template<class U> void operator()(U* ptr) const;
  };
}

类模板 std::unique_ptr

namespace std {
  template<class T, class D = default_delete<T>> class unique_ptr {
  public:
    using pointer      = /* 见描述 */;
    using element_type = T;
    using deleter_type = D;
 
    // 构造函数
    constexpr unique_ptr() noexcept;
    explicit unique_ptr(pointer p) noexcept;
    unique_ptr(pointer p, /* 见描述 */ d1) noexcept;
    unique_ptr(pointer p, /* 见描述 */ d2) noexcept;
    unique_ptr(unique_ptr&& u) noexcept;
    constexpr unique_ptr(nullptr_t) noexcept;
    template<class U, class E>
      unique_ptr(unique_ptr<U, E>&& u) noexcept;
 
    // 析构函数
    ~unique_ptr();
 
    // 赋值
    unique_ptr& operator=(unique_ptr&& u) noexcept;
    template<class U, class E>
      unique_ptr& operator=(unique_ptr<U, E>&& u) noexcept;
    unique_ptr& operator=(nullptr_t) noexcept;
 
    // 观察器
    add_lvalue_reference_t<T> operator*() const noexcept(/* 见描述 */);
    pointer operator->() const noexcept;
    pointer get() const noexcept;
    deleter_type& get_deleter() noexcept;
    const deleter_type& get_deleter() const noexcept;
    explicit operator bool() const noexcept;
 
    // 修改器
    pointer release() noexcept;
    void reset(pointer p = pointer()) noexcept;
    void swap(unique_ptr& u) noexcept;
 
    // 禁用从左值复制
    unique_ptr(const unique_ptr&) = delete;
    unique_ptr& operator=(const unique_ptr&) = delete;
  };
 
  template<class T, class D> class unique_ptr<T[], D> {
  public:
    using pointer      = /* 见描述 */;
    using element_type = T;
    using deleter_type = D;
 
    // 构造函数
    constexpr unique_ptr() noexcept;
    template<class U> explicit unique_ptr(U p) noexcept;
    template<class U> unique_ptr(U p, /* 见描述 */ d) noexcept;
    template<class U> unique_ptr(U p, /* 见描述 */ d) noexcept;
    unique_ptr(unique_ptr&& u) noexcept;
    template<class U, class E>
      unique_ptr(unique_ptr<U, E>&& u) noexcept;
    constexpr unique_ptr(nullptr_t) noexcept;
 
    // 析构函数
    ~unique_ptr();
 
    // 赋值
    unique_ptr& operator=(unique_ptr&& u) noexcept;
    template<class U, class E>
      unique_ptr& operator=(unique_ptr<U, E>&& u) noexcept;
    unique_ptr& operator=(nullptr_t) noexcept;
 
    // 观察器
    T& operator[](size_t i) const;
    pointer get() const noexcept;
    deleter_type& get_deleter() noexcept;
    const deleter_type& get_deleter() const noexcept;
    explicit operator bool() const noexcept;
 
    // 修改器
    pointer release() noexcept;
    template<class U> void reset(U p) noexcept;
    void reset(nullptr_t = nullptr) noexcept;
    void swap(unique_ptr& u) noexcept;
 
    // 禁用从左值复制
    unique_ptr(const unique_ptr&) = delete;
    unique_ptr& operator=(const unique_ptr&) = delete;
  };
}

std::bad_weak_ptr

namespace std {
  class bad_weak_ptr : public exception {
  public:
    bad_weak_ptr() noexcept;
  };
}

类模板 std::shared_ptr

namespace std {
  template<class T> class shared_ptr {
  public:
    using element_type = remove_extent_t<T>;
    using weak_type    = weak_ptr<T>;
 
    // 构造函数
    constexpr shared_ptr() noexcept;
    constexpr shared_ptr(nullptr_t) noexcept : shared_ptr() { }
    template<class Y>
      explicit shared_ptr(Y* p);
    template<class Y, class D>
      shared_ptr(Y* p, D d);
    template<class Y, class D, class A>
      shared_ptr(Y* p, D d, A a);
    template<class D>
      shared_ptr(nullptr_t p, D d);
    template<class D, class A>
      shared_ptr(nullptr_t p, D d, A a);
    template<class Y>
      shared_ptr(const shared_ptr<Y>& r, element_type* p) noexcept;
    template<class Y>
      shared_ptr(shared_ptr<Y>&& r, element_type* p) noexcept;
    shared_ptr(const shared_ptr& r) noexcept;
    template<class Y>
      shared_ptr(const shared_ptr<Y>& r) noexcept;
    shared_ptr(shared_ptr&& r) noexcept;
    template<class Y>
      shared_ptr(shared_ptr<Y>&& r) noexcept;
    template<class Y>
      explicit shared_ptr(const weak_ptr<Y>& r);
    template<class Y, class D>
      shared_ptr(unique_ptr<Y, D>&& r);
 
    // 析构函数
    ~shared_ptr();
 
    // 赋值
    shared_ptr& operator=(const shared_ptr& r) noexcept;
    template<class Y>
      shared_ptr& operator=(const shared_ptr<Y>& r) noexcept;
    shared_ptr& operator=(shared_ptr&& r) noexcept;
    template<class Y>
      shared_ptr& operator=(shared_ptr<Y>&& r) noexcept;
    template<class Y, class D>
      shared_ptr& operator=(unique_ptr<Y, D>&& r);
 
    // 修改器
    void swap(shared_ptr& r) noexcept;
    void reset() noexcept;
    template<class Y>
      void reset(Y* p);
    template<class Y, class D>
      void reset(Y* p, D d);
    template<class Y, class D, class A>
      void reset(Y* p, D d, A a);
 
    // 观察器
    element_type* get() const noexcept;
    T& operator*() const noexcept;
    T* operator->() const noexcept;
    element_type& operator[](ptrdiff_t i) const;
    long use_count() const noexcept;
    explicit operator bool() const noexcept;
    template<class U>
      bool owner_before(const shared_ptr<U>& b) const noexcept;
    template<class U>
      bool owner_before(const weak_ptr<U>& b) const noexcept;
  };
 
  template<class T>
    shared_ptr(weak_ptr<T>) -> shared_ptr<T>;
  template<class T, class D>
    shared_ptr(unique_ptr<T, D>) -> shared_ptr<T>;
}

类模板 std::weak_ptr

namespace std {
  template<class T> class weak_ptr {
  public:
    using element_type = remove_extent_t<T>;
 
    // 构造函数
    constexpr weak_ptr() noexcept;
    template<class Y>
      weak_ptr(const shared_ptr<Y>& r) noexcept;
    weak_ptr(const weak_ptr& r) noexcept;
    template<class Y>
      weak_ptr(const weak_ptr<Y>& r) noexcept;
    weak_ptr(weak_ptr&& r) noexcept;
    template<class Y>
      weak_ptr(weak_ptr<Y>&& r) noexcept;
 
    // 析构函数
    ~weak_ptr();
 
    // 赋值
    weak_ptr& operator=(const weak_ptr& r) noexcept;
    template<class Y>
      weak_ptr& operator=(const weak_ptr<Y>& r) noexcept;
    template<class Y>
      weak_ptr& operator=(const shared_ptr<Y>& r) noexcept;
    weak_ptr& operator=(weak_ptr&& r) noexcept;
    template<class Y>
      weak_ptr& operator=(weak_ptr<Y>&& r) noexcept;
 
    // 修改器
    void swap(weak_ptr& r) noexcept;
    void reset() noexcept;
 
    // 观察器
    long use_count() const noexcept;
    bool expired() const noexcept;
    shared_ptr<T> lock() const noexcept;
    template<class U>
      bool owner_before(const shared_ptr<U>& b) const noexcept;
    template<class U>
      bool owner_before(const weak_ptr<U>& b) const noexcept;
  };
 
  template<class T>
    weak_ptr(shared_ptr<T>) -> weak_ptr<T>;
}

类模板 std::owner_less

namespace std {
  template<class T = void> struct owner_less;
 
  template<class T> struct owner_less<shared_ptr<T>> {
    bool operator()(const shared_ptr<T>&, const shared_ptr<T>&) const noexcept;
    bool operator()(const shared_ptr<T>&, const weak_ptr<T>&) const noexcept;
    bool operator()(const weak_ptr<T>&, const shared_ptr<T>&) const noexcept;
  };
 
  template<class T> struct owner_less<weak_ptr<T>> {
    bool operator()(const weak_ptr<T>&, const weak_ptr<T>&) const noexcept;
    bool operator()(const shared_ptr<T>&, const weak_ptr<T>&) const noexcept;
    bool operator()(const weak_ptr<T>&, const shared_ptr<T>&) const noexcept;
  };
 
  template<> struct owner_less<void> {
    template<class T, class U>
      bool operator()(const shared_ptr<T>&, const shared_ptr<U>&) const noexcept;
    template<class T, class U>
      bool operator()(const shared_ptr<T>&, const weak_ptr<U>&) const noexcept;
    template<class T, class U>
      bool operator()(const weak_ptr<T>&, const shared_ptr<U>&) const noexcept;
    template<class T, class U>
      bool operator()(const weak_ptr<T>&, const weak_ptr<U>&) const noexcept;
 
    using is_transparent = /* 未指明 */;
  };
}

类模板 std::enable_shared_from_this

namespace std {
  template<class T> class enable_shared_from_this {
  protected:
    constexpr enable_shared_from_this() noexcept;
    enable_shared_from_this(const enable_shared_from_this&) noexcept;
    enable_shared_from_this& operator=(const enable_shared_from_this&) noexcept;
    ~enable_shared_from_this();
 
  public:
    shared_ptr<T> shared_from_this();
    shared_ptr<T const> shared_from_this() const;
    weak_ptr<T> weak_from_this() noexcept;
    weak_ptr<T const> weak_from_this() const noexcept;
 
  private:
    mutable weak_ptr<T> weak_this;  // 仅用于阐释
  };
}

类模板 std::atomicstd::shared_ptr 的特化

namespace std {
  template<class T> struct atomic<shared_ptr<T>> {
    using value_type = shared_ptr<T>;
    static constexpr bool is_always_lock_free = /* 由实现定义 */;
 
    bool is_lock_free() const noexcept;
    void store(shared_ptr<T> desired, memory_order order = memory_order::seq_cst) noexcept;
    shared_ptr<T> load(memory_order order = memory_order::seq_cst) const noexcept;
    operator shared_ptr<T>() const noexcept;
 
    shared_ptr<T> exchange(shared_ptr<T> desired,
                           memory_order order = memory_order::seq_cst) noexcept;
 
    bool compare_exchange_weak(shared_ptr<T>& expected, shared_ptr<T> desired,
                               memory_order success, memory_order failure) noexcept;
    bool compare_exchange_strong(shared_ptr<T>& expected, shared_ptr<T> desired,
                                 memory_order success, memory_order failure) noexcept;
 
    bool compare_exchange_weak(shared_ptr<T>& expected, shared_ptr<T> desired,
                               memory_order order = memory_order::seq_cst) noexcept;
    bool compare_exchange_strong(shared_ptr<T>& expected, shared_ptr<T> desired,
                                 memory_order order = memory_order::seq_cst) noexcept;
 
    constexpr atomic() noexcept = default;
    atomic(shared_ptr<T> desired) noexcept;
    atomic(const atomic&) = delete;
    void operator=(const atomic&) = delete;
    void operator=(shared_ptr<T> desired) noexcept;
 
  private:
    shared_ptr<T> p;            // 仅用于阐释
  };
}

类模板 std::atomicstd::weak_ptr 的特化

namespace std {
  template<class T> struct atomic<weak_ptr<T>> {
    using value_type = weak_ptr<T>;
    static constexpr bool is_always_lock_free = /* 由实现定义 */;
 
    bool is_lock_free() const noexcept;
    void store(weak_ptr<T> desired, memory_order order = memory_order::seq_cst) noexcept;
    weak_ptr<T> load(memory_order order = memory_order::seq_cst) const noexcept;
    operator weak_ptr<T>() const noexcept;
 
    weak_ptr<T> exchange(weak_ptr<T> desired,
                         memory_order order = memory_order::seq_cst) noexcept;
 
    bool compare_exchange_weak(weak_ptr<T>& expected, weak_ptr<T> desired,
                               memory_order success, memory_order failure) noexcept;
    bool compare_exchange_strong(weak_ptr<T>& expected, weak_ptr<T> desired,
                                 memory_order success, memory_order failure) noexcept;
 
    bool compare_exchange_weak(weak_ptr<T>& expected, weak_ptr<T> desired,
                               memory_order order = memory_order::seq_cst) noexcept;
    bool compare_exchange_strong(weak_ptr<T>& expected, weak_ptr<T> desired,
                                 memory_order order = memory_order::seq_cst) noexcept;
 
    constexpr atomic() noexcept = default;
    atomic(weak_ptr<T> desired) noexcept;
    atomic(const atomic&) = delete;
    void operator=(const atomic&) = delete;
    void operator=(weak_ptr<T> desired) noexcept;
 
  private:
    weak_ptr<T> p;              // 仅用于阐释
  };
}

类模板 std::out_ptr_t

namespace std {
  template<class Smart, class Pointer, class... Args>
  class out_ptr_t {
  public:
    explicit out_ptr_t(Smart&, Args...);
    out_ptr_t(const out_ptr_t&) = delete;
 
    ~out_ptr_t();
 
    operator Pointer*() const noexcept;
    operator void**() const noexcept;
 
  private:
    Smart& s;                   // 仅用于阐释
    tuple<Args...> a;           // 仅用于阐释
    Pointer p;                  // 仅用于阐释
  };
}

类模板 std::in_out_ptr_t

namespace std {
  template<class Smart, class Pointer, class... Args>
  class inout_ptr_t {
  public:
    explicit inout_ptr_t(Smart&, Args...);
    inout_ptr_t(const inout_ptr_t&) = delete;
 
    ~inout_ptr_t();
 
    operator Pointer*() const noexcept;
    operator void**() const noexcept;
 
  private:
    Smart& s;                   // 仅用于阐释
    tuple<Args...> a;           // 仅用于阐释
    Pointer p;                  // 仅用于阐释
  };
}