Namespaces
Variants

Standard library header <memory>

From cppreference.net
Standard library headers

このヘッダは 動的メモリ管理 ライブラリの一部です。

目次

インクルード

(C++20)
三方比較演算子 サポート

クラス

ポインタ特性
ポインタライクな型に関する情報を提供する
(クラステンプレート)
ガベージコレクタサポート
(C++11) (C++23で削除)
ポインタ安全性モデルを列挙する
(列挙型)
アロケータ
デフォルトアロケータ
(クラステンプレート)
アロケータ型に関する情報を提供する
(クラステンプレート)
allocate_at_least によって割り当てられたストレージのアドレスと実際のサイズを記録する
(クラステンプレート)
指定された型がuses-allocator構築をサポートするかどうかをチェックする
(クラステンプレート)
未初期化ストレージ
(C++17で非推奨) (C++20で削除)
標準アルゴリズムが未初期化メモリに結果を格納できるようにするイテレータ
(クラステンプレート)
スマートポインタ
(C++11)
ユニークなオブジェクト所有権セマンティクスを持つスマートポインタ
(クラステンプレート)
(C++11)
共有オブジェクト所有権セマンティクスを持つスマートポインタ
(クラステンプレート)
(C++11)
std::shared_ptr によって管理されるオブジェクトへの弱参照
(クラステンプレート)
(C++11で非推奨) (C++17で削除)
厳密なオブジェクト所有権セマンティクスを持つスマートポインタ
(クラステンプレート)
スマートポインタアダプタ
(C++23)
外部ポインタ設定子と相互運用し、スマートポインタを破棄時にリセットする
(クラステンプレート)
外部ポインタ設定機能と相互運用し、スマートポインタから初期ポインタ値を取得し、破棄時にリセットする
(クラステンプレート)
複合クラス設計のための型
(C++26)
値のようなセマンティクスを持つ動的に割り当てられたオブジェクトを含むラッパー
(クラステンプレート)
値のようなセマンティクスを持つ動的に割り当てられたオブジェクトを含むポリモーフィックなラッパー
(クラステンプレート)
ヘルパークラス
アトミック共有ポインタ
(クラステンプレートの特殊化)
アトミック弱ポインタ
(クラステンプレートの特殊化)
(C++11)
sharedポインタとweakポインタの混合型所有者ベースの順序付けを提供する
(クラステンプレート)
(C++26)
共有ポインタおよび弱ポインタに対する所有者ベースのハッシュを提供する
(クラス)
共有ポインタと弱ポインタの混合型所有者ベース等値比較を提供する
(クラス)
オブジェクトが自身を参照する shared_ptr を作成できるようにする
(クラステンプレート)
既に破棄されたオブジェクトを参照する weak_ptr にアクセスした際にスローされる例外
(クラス)
unique_ptr のデフォルト削除子
(クラステンプレート)
std::unique_ptr のハッシュサポート
(クラステンプレートの特殊化)
std::shared_ptr のハッシュサポート
(クラステンプレートの特殊化)
std::indirect のハッシュサポート
(クラステンプレートの特殊化)
前方宣言
ヘッダーで定義 <functional>
(C++11)
ハッシュ関数オブジェクト
(クラステンプレート)
ヘッダーで定義 <atomic>
(C++11)
atomicクラステンプレートとbool、整数型、 浮動小数点型、 (C++20以降) およびポインタ型の特殊化
(クラステンプレート)

タグ

アロケータ対応コンストラクタを選択するために使用されるタグ
(タグ)

関数

ユーザーアロケータ構築
指定された型が必要とするuses-allocator構築の形式に一致する引数リストを準備する
(関数テンプレート)
指定された型のオブジェクトをuses-allocator構築によって作成する
(関数テンプレート)
指定されたメモリ位置で、uses-allocator構築によって与えられた型のオブジェクトを作成する
(関数テンプレート)
その他
(C++20)
ポインタライクな型から生ポインタを取得する
(関数テンプレート)
(C++11)
オブジェクトの実際のアドレスを取得する( & 演算子がオーバーロードされている場合でも)
(関数テンプレート)
(C++11)
バッファ内のポインタをアライメントする
(関数)
ポインタがアラインされていることをコンパイラに通知する
(関数テンプレート)
ポインタが、指定された値以上のアライメントを持つオブジェクトを指しているかどうかをチェックする
(関数テンプレート)
明示的ライフタイム管理
指定されたストレージ内でオブジェクト表現を再利用してオブジェクトを暗黙的に作成する
(関数テンプレート)
ガベージコレクタサポート
(C++11) (removed in C++23)
オブジェクトが回収不能であることを宣言する
(関数)
(C++11) (removed in C++23)
オブジェクトが回収可能であることを宣言する
(関数テンプレート)
(C++11) (removed in C++23)
メモリ領域がトレース可能なポインタを含まないことを宣言する
(関数)
(C++11) (C++23で削除)
std::declare_no_pointers の効果をキャンセルする
(関数)
(C++11) (C++23で削除)
現在のポインタ安全性モデルを返す
(関数)
未初期化ストレージ
オブジェクトの範囲を未初期化メモリ領域にコピーする
(関数テンプレート)
指定された数のオブジェクトを未初期化メモリ領域にコピーする
(関数テンプレート)
オブジェクトを範囲で定義された未初期化メモリ領域にコピーします
(関数テンプレート)
開始位置とカウントで定義される未初期化メモリ領域にオブジェクトをコピーする
(関数テンプレート)
オブジェクトの範囲を未初期化メモリ領域に移動する
(関数テンプレート)
指定された数のオブジェクトを未初期化メモリ領域へ移動する
(関数テンプレート)
未初期化メモリ領域内の範囲でオブジェクトを デフォルト初期化 によって構築する
(関数テンプレート)
初期化されていないメモリ領域内で、開始位置とカウントで定義された範囲のオブジェクトを デフォルト初期化 によって構築する
(関数テンプレート)
未初期化メモリ領域内のオブジェクトを value-initialization によって構築する(範囲で定義)
(関数テンプレート)
オブジェクトを value-initialization によって未初期化メモリ領域に構築する(開始位置とカウントで定義される)
(関数テンプレート)
指定されたアドレスにオブジェクトを生成する
(関数テンプレート)
(C++17)
指定されたアドレスのオブジェクトを破棄する
(関数テンプレート)
(C++17)
オブジェクトの範囲を破棄する
(関数テンプレート)
(C++17)
範囲内の複数のオブジェクトを破棄する
(関数テンプレート)
(C++17で非推奨) (C++20で削除)
未初期化ストレージを取得する
(関数テンプレート)
(C++17で非推奨) (C++20で削除)
初期化されていないストレージを解放する
(関数テンプレート)
スマートポインタ非メンバー操作
新しいオブジェクトを管理するunique pointerを作成する
(関数テンプレート)
他の unique_ptr または nullptr との比較
(関数テンプレート)
新しいオブジェクトを管理するshared pointerを作成する
(関数テンプレート)
アロケータを使用して割り当てられた新しいオブジェクトを管理するshared_ptrを作成する
(関数テンプレート)
格納されたポインタに static_cast dynamic_cast const_cast または reinterpret_cast を適用する
(関数テンプレート)
所有されている場合、指定された型のデリーターを返す
(関数テンプレート)
(C++20で削除) (C++20で削除) (C++20で削除) (C++20で削除) (C++20で削除) (C++20)
別の shared_ptr または nullptr と比較する
(関数テンプレート)
格納されたポインタの値を出力ストリームに書き出す
(関数テンプレート)
管理対象ポインタの値を出力ストリームに出力する
(関数テンプレート)
std::swap アルゴリズムを特殊化
(関数テンプレート)
std::swap アルゴリズムを特殊化
(関数テンプレート)
std::swap アルゴリズムを特殊化
(関数テンプレート)
スマートポインタアダプタの作成
(C++23)
関連するスマートポインタとリセット引数を持つ out_ptr_t を作成する
(関数テンプレート)
(C++23)
関連するスマートポインタとリセット引数を持つ inout_ptr_t を作成する
(関数テンプレート)
std::shared_ptr に対するアトミック操作の特殊化
(関数テンプレート)

関数風エンティティ

名前空間で定義 std::ranges
未初期化ストレージ
オブジェクトの範囲を未初期化メモリ領域にコピーする
(アルゴリズム関数オブジェクト)
指定された数のオブジェクトを未初期化メモリ領域にコピーする
(アルゴリズム関数オブジェクト)
オブジェクトを範囲で定義された未初期化メモリ領域にコピーする
(アルゴリズム関数オブジェクト)
オブジェクトを開始位置とカウントで定義された未初期化メモリ領域にコピーする
(アルゴリズム関数オブジェクト)
オブジェクトの範囲を未初期化メモリ領域にムーブする
(アルゴリズム関数オブジェクト)
指定された数のオブジェクトを未初期化メモリ領域にムーブする
(アルゴリズム関数オブジェクト)
範囲で定義された未初期化メモリ領域で デフォルト初期化 によってオブジェクトを構築する
(アルゴリズム関数オブジェクト)
開始位置とカウントで定義された未初期化メモリ領域で デフォルト初期化 によってオブジェクトを構築する
(アルゴリズム関数オブジェクト)
範囲で定義された未初期化メモリ領域で 値初期化 によってオブジェクトを構築する
(アルゴリズム関数オブジェクト)
開始位置とカウントで定義された未初期化メモリ領域で 値初期化 によってオブジェクトを構築する
(アルゴリズム関数オブジェクト)
指定されたアドレスにオブジェクトを作成する
(アルゴリズム関数オブジェクト)
指定されたアドレスのオブジェクトを破棄する
(アルゴリズム関数オブジェクト)
オブジェクトの範囲を破棄する
(アルゴリズム関数オブジェクト)
範囲内の指定された数のオブジェクトを破棄する
(アルゴリズム関数オブジェクト)

概要

#include <compare>
namespace std {
  // ポインタ特性
  template<class Ptr>
  struct pointer_traits; // freestanding
  template<class T>
  struct pointer_traits<T*>; // フリースタンディング
  // ポインタ変換
  template<class T>
  constexpr T* to_address(T* p) noexcept; // freestanding
  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>
  constexpr T* assume_aligned(T* ptr); // フリースタンディング
  template<size_t Alignment, class T>
  bool is_sufficiently_aligned(T* ptr);
  // 明示的な寿命管理
  template<class T>
  T* start_lifetime_as(void* p) noexcept; // フリースタンディング
  template<class T>
  const T* start_lifetime_as(const void* p) noexcept; // フリースタンディング
  template<class T>
  volatile T* start_lifetime_as(volatile void* p) noexcept; // freestanding
  template<class T>
  const volatile T* start_lifetime_as(const volatile void* p) noexcept; // freestanding
  template<class T>
  T* start_lifetime_as_array(void* p, size_t n) noexcept; // freestanding
  template<class T>
  const T* start_lifetime_as_array(const void* p, size_t n) noexcept; // freestanding
  template<class T>
  volatile T* start_lifetime_as_array(volatile void* p,
                                      size_t n) noexcept; // freestanding
  template<class T>
  const volatile T* start_lifetime_as_array(const volatile void* p, // freestanding
                                            size_t n) noexcept;
  template<class T>
  T* trivially_relocate(T* first, T* last, T* result); // freestanding
  template<class T>
  constexpr T* relocate(T* first, T* last, T* result); // freestanding
  // アロケータ引数タグ
  struct allocator_arg_t
  {
    explicit allocator_arg_t() = default;
  };                                                // フリースタンディング
  inline constexpr allocator_arg_t allocator_arg{}; // freestanding
  // uses_allocator
  template<class T, class Alloc>
  struct uses_allocator; // freestanding
  // uses_allocator
  template<class T, class Alloc>
  constexpr bool uses_allocator_v = uses_allocator<T, Alloc>::value; // freestanding
  // uses-allocator construction
  template<class T, class Alloc, class... Args>
  constexpr auto uses_allocator_construction_args(const Alloc& alloc, // freestanding
                                                  Args&&... args) noexcept;
  template<class T, class Alloc, class Tuple1, class Tuple2>
  constexpr auto uses_allocator_construction_args(const Alloc& alloc, // freestanding
                                                  piecewise_construct_t,
                                                  Tuple1&& x,
                                                  Tuple2&& y) noexcept;
  template<class T, class Alloc>
  constexpr auto uses_allocator_construction_args(
    const Alloc& alloc) noexcept; // freestanding
  template<class T, class Alloc, class U, class V>
  constexpr auto uses_allocator_construction_args(const Alloc& alloc, // freestanding
                                                  U&& u,
                                                  V&& v) noexcept;
  template<class T, class Alloc, class U, class V>
  constexpr auto uses_allocator_construction_args(const Alloc& alloc, // freestanding
                                                  pair<U, V>& pr) noexcept;
  template<class T, class Alloc, class U, class V>
  constexpr auto uses_allocator_construction_args(const Alloc& alloc, // freestanding
                                                  const pair<U, V>& pr) noexcept;
  template<class T, class Alloc, class U, class V>
  constexpr auto uses_allocator_construction_args(const Alloc& alloc, // freestanding
                                                  pair<U, V>&& pr) noexcept;
  template<class T, class Alloc, class U, class V>
  constexpr auto uses_allocator_construction_args(const Alloc& alloc, // freestanding
                                                  const pair<U, V>&& pr) noexcept;
  template<class T, class Alloc, /*pair-like*/ P>
  constexpr auto uses_allocator_construction_args(const Alloc& alloc, // freestanding
                                                  P&& p) noexcept;
  template<class T, class Alloc, class U>
  constexpr auto uses_allocator_construction_args(const Alloc& alloc, // freestanding
                                                  U&& u) noexcept;
  template<class T, class Alloc, class... Args>
  constexpr T make_obj_using_allocator(const Alloc& alloc,
                                       Args&&... args); // freestanding
  template<class T, class Alloc, class... Args>
  constexpr T* uninitialized_construct_using_allocator(T* p, // freestanding
                                                       const Alloc& alloc,
                                                       Args&&... args);
  // allocator Traits
  template<class Alloc>
  struct allocator_traits; // freestanding
  template<class Pointer, class SizeType = size_t>
  struct allocation_result
  { // freestanding
    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; // freestanding
  template<class T>
  const T* addressof(const T&&) = delete; // freestanding
  // 特殊化アルゴリズム
  // 特殊メモリ概念
  template<class I>
  concept no-throw-input-iterator
(注:指定された条件により、HTMLタグ・属性は翻訳せず、C++専門用語も翻訳対象外のため、元のテキストを保持しています) = /* 説明を参照 */; // 説明専用
  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 NoThrowForwardIter>
  constexpr void uninitialized_default_construct(NoThrowForwardIter first, // フリースタンディング
                                                 NoThrowForwardIter last);
  template<class ExecutionPolicy, class NoThrowForwardIter>
  void uninitialized_default_construct(ExecutionPolicy&& exec, // freestanding-deleted,
                                       NoThrowForwardIter first,
                                       NoThrowForwardIter last);
  template<class NoThrowForwardIter, class Size>
  constexpr NoThrowForwardIter uninitialized_default_construct_n(NoThrowForwardIter first,
                                                                 Size n); // フリースタンディング
  template<class ExecutionPolicy, class NoThrowForwardIter, class Size>
  NoThrowForwardIter uninitialized_default_construct_n(
    ExecutionPolicy&& exec, // freestanding-deleted,
    NoThrowForwardIter first,
    Size n);
  namespace ranges {
    template<no-throw-forward-iterator I, no-throw-sentinel-for<I> S>
      requires default_initializable<iter_value_t<I>>
    constexpr I uninitialized_default_construct(I first, S last); // freestanding
    template<no-throw-forward-range
(注:指定された条件に基づき、HTMLタグ・属性は翻訳せず、C++専門用語も翻訳していません) R>
      requires default_initializable<range_value_t<R>>
    constexpr borrowed_iterator_t<R> uninitialized_default_construct(
      R&& r); // フリースタンディング
    template<no-throw-forward-iterator I>
      requires default_initializable<iter_value_t<I>>
    constexpr I uninitialized_default_construct_n(I first, // freestanding
                                                  iter_difference_t<I> n);
  }
  template<class NoThrowForwardIter>
  constexpr void uninitialized_value_construct(NoThrowForwardIter first, // freestanding
                                               NoThrowForwardIter last);
  template<class ExecutionPolicy, class NoThrowForwardIter>
  void uninitialized_value_construct(ExecutionPolicy&& exec, // freestanding-deleted,
                                     NoThrowForwardIter first,
                                     NoThrowForwardIter last);
  template<class NoThrowForwardIter, class Size>
  constexpr NoThrowForwardIter uninitialized_value_construct_n(NoThrowForwardIter first,
                                                               Size n); // フリースタンディング
  template<class ExecutionPolicy, class NoThrowForwardIter, class Size>
  NoThrowForwardIter uninitialized_value_construct_n(
    ExecutionPolicy&& exec, // freestanding-deleted,
    NoThrowForwardIter first,
    Size n);
  namespace ranges {
    template<no-throw-forward-iterator
(注:指定された条件により、HTMLタグ・属性は翻訳せず、C++専門用語も翻訳対象外のため、元のテキストを保持しています) I, no-throw-sentinel-for<I> S>
      requires default_initializable<iter_value_t<I>>
    constexpr I uninitialized_value_construct(I first, S last); // フリースタンディング
    template<no-throw-forward-range R>
      requires default_initializable<range_value_t<R>>
    constexpr borrowed_iterator_t<R> uninitialized_value_construct(R&& r); // フリースタンディング
    template<no-throw-forward-iterator I>
      requires default_initializable<iter_value_t<I>>
    constexpr I uninitialized_value_construct_n(I first, // freestanding
                                                iter_difference_t<I> n);
  }
  template<class InputIter, class NoThrowForwardIter>
  constexpr NoThrowForwardIter uninitialized_copy(InputIter first, // フリースタンディング
                                                  InputIter last,
                                                  NoThrowForwardIter result);
  template<class ExecutionPolicy, class ForwardIter, class NoThrowForwardIter>
  NoThrowForwardIter uninitialized_copy(ExecutionPolicy&& exec, // freestanding-deleted,
                                        ForwardIter first,
                                        ForwardIter last,
                                        NoThrowForwardIter result);
  template<class InputIter, class Size, class NoThrowForwardIter>
  constexpr NoThrowForwardIter uninitialized_copy_n(InputIter first, // フリースタンディング
                                                    Size n,
                                                    NoThrowForwardIter result);
  template<class ExecutionPolicy,
           class ForwardIter,
           class Size,
           class NoThrowForwardIter>
  NoThrowForwardIter uninitialized_copy_n(ExecutionPolicy&& exec, // freestanding-deleted,
                                          ForwardIter first,
                                          Size n,
                                          NoThrowForwardIter result);
  namespace ranges {
    template<class I, class O>
    using uninitialized_copy_result = in_out_result<I, O>; // freestanding
    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>>
    constexpr uninitialized_copy_result<I, O>
    uninitialized_copy(I ifirst, S1 ilast, O ofirst, S2 olast); // freestanding
    template<input_range IR, no-throw-forward-range OR>
      requires constructible_from<range_value_t<OR>, range_reference_t<IR>>
    constexpr 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>; // freestanding
    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>>
    constexpr uninitialized_copy_n_result<I, O> uninitialized_copy_n(
      I ifirst,
      iter_difference_t<I> n, // freestanding
      O ofirst,
      S olast);
  }
  template<class InputIter, class NoThrowForwardIter>
  constexpr NoThrowForwardIter uninitialized_move(InputIter first, // freestanding
                                                  InputIter last,
                                                  NoThrowForwardIter result);
  template<class ExecutionPolicy, class ForwardIter, class NoThrowForwardIter>
  NoThrowForwardIter uninitialized_move(ExecutionPolicy&& exec, // freestanding-deleted,
                                        ForwardIter first,
                                        ForwardIter last,
                                        NoThrowForwardIter result);
  template<class InputIter, class Size, class NoThrowForwardIter>
  constexpr pair<InputIter, NoThrowForwardIter> uninitialized_move_n(
    InputIter first,
    Size n, // freestanding
    NoThrowForwardIter result);
  template<class ExecutionPolicy, class ForwardIter, class Size, class NoThrowForwardIter>
  pair<ForwardIter, NoThrowForwardIter> uninitialized_move_n(
    ExecutionPolicy&& exec, // freestanding-deleted,
    ForwardIter first,
    Size n,
    NoThrowForwardIter 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
(注:指定された条件により、HTMLタグ・属性は翻訳せず、タグ内のテキストも翻訳対象外のため、元の英語表記を維持しています) O,
             no-throw-sentinel-for<O> S2>
      requires constructible_from<iter_value_t<O>, iter_rvalue_reference_t<I>>
    constexpr uninitialized_move_result<I, O>
    uninitialized_move(I ifirst, S1 ilast, O ofirst, S2 olast); // freestanding
    template<input_range IR, no-throw-forward-range OR>
      requires constructible_from<range_value_t<OR>, range_rvalue_reference_t<IR>>
    constexpr uninitialized_move_result<borrowed_iterator_t<IR>, borrowed_iterator_t<OR>>
    uninitialized_move(IR&& in_range, OR&& out_range); // freestanding
    template<class I, class O>
    using uninitialized_move_n_result = in_out_result<I, O>; // freestanding
    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>>
    constexpr uninitialized_move_n_result<I, O> uninitialized_move_n(
      I ifirst,
      iter_difference_t<I> n, // フリースタンディング
      O ofirst,
      S olast);
  }
  template<class NoThrowForwardIter, class T>
  constexpr void uninitialized_fill(NoThrowForwardIter first, // freestanding
                                    NoThrowForwardIter last,
                                    const T& x);
  template<class ExecutionPolicy, class NoThrowForwardIter, class T>
  void uninitialized_fill(ExecutionPolicy&& exec, // freestanding-deleted,
                          NoThrowForwardIter first,
                          NoThrowForwardIter last,
                          const T& x);
  template<class NoThrowForwardIter, class Size, class T>
  constexpr NoThrowForwardIter uninitialized_fill_n(NoThrowForwardIter first,
                                                    Size n,
                                                    const T& x); // freestanding
  template<class ExecutionPolicy, class NoThrowForwardIter, class Size, class T>
  NoThrowForwardIter uninitialized_fill_n(ExecutionPolicy&& exec, // freestanding-deleted,
                                          NoThrowForwardIter 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&>
    constexpr I uninitialized_fill(I first, S last, const T& x); // freestanding
    template<no-throw-forward-range R, class T>
      requires constructible_from<range_value_t<R>, const T&>
    constexpr borrowed_iterator_t<R> uninitialized_fill(R&& r,
                                                        const T& x); // freestanding
    template<no-throw-forward-iterator I, class T>
      requires constructible_from<iter_value_t<I>, const T&>
    constexpr I uninitialized_fill_n(I first, // freestanding
                                     iter_difference_t<I> n,
                                     const T& x);
  }
  // construct_at
  template<class T, class... Args>
  constexpr T* construct_at(T* location, Args&&... args); // freestanding
  namespace ranges {
    template<class T, class... Args>
    constexpr T* construct_at(T* location, Args&&... args); // freestanding
  }
  // 破棄
  template<class T>
  constexpr void destroy_at(T* location); // freestanding
  template<class NoThrowForwardIter>
  constexpr void destroy(NoThrowForwardIter first, // freestanding
                         NoThrowForwardIter last);
  template<class ExecutionPolicy, class NoThrowForwardIter>
  void destroy(ExecutionPolicy&& exec, // freestanding-deleted,
               NoThrowForwardIter first,
               NoThrowForwardIter last);
  template<class NoThrowForwardIter, class Size>
  constexpr NoThrowForwardIter destroy_n(NoThrowForwardIter first, // freestanding
                                         Size n);
  template<class ExecutionPolicy, class NoThrowForwardIter, class Size>
  NoThrowForwardIter destroy_n(ExecutionPolicy&& exec, // freestanding-deleted,
                               NoThrowForwardIter first,
                               Size n);
  namespace ranges {
    template<destructible T>
    constexpr void destroy_at(T* location) noexcept; // freestanding
    template<no-throw-input-iterator
(注:指定された条件により、HTMLタグ・属性は翻訳せず、C++専門用語も翻訳対象外のため、元のテキストを保持しています) I, no-throw-sentinel-for<I> S>
      requires destructible<iter_value_t<I>>
    constexpr I destroy(I first, S last) noexcept; // freestanding
    template<no-throw-input-range R>
      requires destructible<range_value_t<R>>
    constexpr borrowed_iterator_t<R> destroy(R&& r) noexcept; // freestanding
    template<no-throw-input-iterator I>
      requires destructible<iter_value_t<I>>
    constexpr I destroy_n(I first, iter_difference_t<I> n) noexcept; // freestanding
  }
  // クラステンプレート unique_ptr
  template<class T>
  struct default_delete; // freestanding
  template<class T>
  struct default_delete<T[]>; // freestanding
  template<class T, class D = default_delete<T>>
  class unique_ptr; // freestanding
  template<class T, class D>
  class unique_ptr<T[], D>; // freestanding
  template<class T, class... Args>
  constexpr unique_ptr<T> make_unique(Args&&... args); // T は配列ではない
  template<class T>
  constexpr 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>
  constexpr unique_ptr<T> make_unique_for_overwrite(); // T は配列ではない
  template<class T>
  constexpr 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>
  constexpr void swap(unique_ptr<T, D>& x, unique_ptr<T, D>& y) noexcept; // freestanding
  template<class T1, class D1, class T2, class D2>
  constexpr 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); // freestanding
  template<class T1, class D1, class T2, class D2>
  bool operator>(const unique_ptr<T1, D1>& x,
                 const unique_ptr<T2, D2>& y); // freestanding
  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>::ポインタ,
                                       typename unique_ptr<T2, D2>::ポインタ>
  compare_three_way_result_t<typename unique_ptr<T1, D1>::ポインタ,
                             typename unique_ptr<T2, D2>::ポインタ>
  operator<=>(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y); // フリースタンディング
  template<class T, class D>
  constexpr bool operator==(const unique_ptr<T, D>& x,
                            nullptr_t) noexcept; // freestanding
  template<class T, class D>
  constexpr bool operator<(const unique_ptr<T, D>& x, nullptr_t); // freestanding
  template<class T, class D>
  constexpr bool operator<(nullptr_t, const unique_ptr<T, D>& y); // freestanding
  template<class T, class D>
  constexpr bool operator>(const unique_ptr<T, D>& x, nullptr_t); // freestanding
  template<class T, class D>
  constexpr bool operator>(nullptr_t, const unique_ptr<T, D>& y); // freestanding
  template<class T, class D>
  constexpr bool operator<=(const unique_ptr<T, D>& x, nullptr_t); // freestanding
  template<class T, class D>
  constexpr bool operator<=(nullptr_t, const unique_ptr<T, D>& y); // freestanding
  template<class T, class D>
  constexpr bool operator>=(const unique_ptr<T, D>& x, nullptr_t); // freestanding
  template<class T, class D>
  constexpr bool operator>=(nullptr_t, const unique_ptr<T, D>& y); // freestanding
  template<class T, class D>
    requires three_way_comparable<typename unique_ptr<T, D>::ポインタ>
  constexpr compare_three_way_result_t<typename unique_ptr<T, D>::ポインタ> operator<=>(
    const unique_ptr<T, D>& x,
    nullptr_t); // freestanding
  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);
  // class 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;
  // struct owner_hash
  struct owner_hash;
  // struct owner_equal
  struct owner_equal;
  // クラステンプレート enable_shared_from_this
  template<class T>
  class enable_shared_from_this;
  // ハッシュサポート
  template<class T>
  struct hash; // freestanding
  template<class T, class D>
  struct hash<unique_ptr<T, D>>; // freestanding
  template<class T>
  struct hash<shared_ptr<T>>;
  // atomic smart pointers
  template<class T>
  struct atomic; // freestanding
  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; // freestanding
  // 関数テンプレート out_ptr
  template<class Pointer = void, class Smart, class... Args>
  auto out_ptr(Smart& s, Args&&... args); // freestanding
  // クラステンプレート inout_ptr_t
  template<class Smart, class Pointer, class... Args>
  class inout_ptr_t; // freestanding
  // 関数テンプレート inout_ptr
  template<class Pointer = void, class Smart, class... Args>
  auto inout_ptr(Smart& s, Args&&... args); // freestanding
  // クラステンプレート indirect
  template<class T, class Allocator = allocator<T>>
  class indirect;
  // ハッシュサポート
  template<class T, class Alloc>
  struct hash<indirect<T, Alloc>>;
  // クラステンプレート ポリモーフィック
  template<class T, class Allocator = allocator<T>>
  class polymorphic;
  namespace pmr {
    template<class T>
    using indirect = indirect<T, polymorphic_allocator<T>>;
    template<class T>
    using polymorphic = polymorphic<T, polymorphic_allocator<T>>;
  }
}

ヘルパー概念

注記: これらの名前 は説明専用であり、インターフェースの一部ではありません。

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
  {
    /* 詳細は説明を参照 */;
  };
  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>>;
    static constexpr pointer allocate(Alloc& a, size_type n);
    static constexpr pointer allocate(Alloc& a, size_type n, const_void_pointer hint);
    static constexpr allocation_result<pointer, size_type> allocate_at_least(Alloc& a,
                                                                             size_type n);
    static constexpr void deallocate(Alloc& a, pointer p, size_type n);
    template<class T, class... Args>
    static constexpr void construct(Alloc& a, T* p, Args&&... args);
    template<class T>
    static constexpr void destroy(Alloc& a, T* p);
    static constexpr size_type max_size(const Alloc& a) noexcept;
    static constexpr 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;
    constexpr T* allocate(size_t n);
    constexpr allocation_result<T*> allocate_at_least(size_t n);
    constexpr void deallocate(T* p, size_t n);
  };
}

クラステンプレート std::default_delete

namespace std {
  template<class T>
  struct default_delete
  {
    constexpr default_delete() noexcept = default;
    template<class U>
    constexpr default_delete(const default_delete<U>&) noexcept;
    constexpr void operator()(T*) const;
  };
  template<class T>
  struct default_delete<T[]>
  {
    constexpr default_delete() noexcept = default;
    template<class U>
    constexpr default_delete(const default_delete<U[]>&) noexcept;
    template<class U>
    constexpr 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;
    constexpr explicit unique_ptr(type_identity_t<pointer> p) noexcept;
    constexpr unique_ptr(type_identity_t<pointer> p, /* 説明を参照 */ d1) noexcept;
    constexpr unique_ptr(type_identity_t<pointer> p, /* 説明を参照 */ d2) noexcept;
    constexpr unique_ptr(unique_ptr&& u) noexcept;
    constexpr unique_ptr(nullptr_t) noexcept;
    template<class U, class E>
    constexpr unique_ptr(unique_ptr<U, E>&& u) noexcept;
    // デストラクタ
    constexpr ~unique_ptr();
    // assignment
    constexpr unique_ptr& operator=(unique_ptr&& u) noexcept;
    template<class U, class E>
    constexpr unique_ptr& operator=(unique_ptr<U, E>&& u) noexcept;
    constexpr unique_ptr& operator=(nullptr_t) noexcept;
    // オブザーバー
    constexpr add_lvalue_reference_t<T> operator*() const noexcept(/* 説明を参照 */);
    constexpr pointer operator->() const noexcept;
    constexpr pointer get() const noexcept;
    constexpr deleter_type& get_deleter() noexcept;
    constexpr const deleter_type& get_deleter() const noexcept;
    constexpr explicit operator bool() const noexcept;
    // 修飾子
    constexpr pointer release() noexcept;
    constexpr void reset(pointer p = pointer()) noexcept;
    constexpr void swap(unique_ptr& u) noexcept;
    // lvalueからのコピーを無効化
    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>
    constexpr explicit unique_ptr(U p) noexcept;
    template<class U>
    constexpr unique_ptr(U p, /* 詳細は説明を参照 */ d) noexcept;
    template<class U>
    constexpr unique_ptr(U p, /* 説明を参照 */ d) noexcept;
    constexpr unique_ptr(unique_ptr&& u) noexcept;
    template<class U, class E>
    constexpr unique_ptr(unique_ptr<U, E>&& u) noexcept;
    constexpr unique_ptr(nullptr_t) noexcept;
    // デストラクタ
    constexpr ~unique_ptr();
    // 代入
    constexpr unique_ptr& operator=(unique_ptr&& u) noexcept;
    template<class U, class E>
    constexpr unique_ptr& operator=(unique_ptr<U, E>&& u) noexcept;
    constexpr unique_ptr& operator=(nullptr_t) noexcept;
    // オブザーバー
    constexpr T& operator[]
(注:元のテキストは閉じ括弧のみのため、日本語でも同じ記号を保持します)(size_t i) const;
    constexpr pointer get() const noexcept;
    constexpr deleter_type& get_deleter() noexcept;
    constexpr const deleter_type& get_deleter() const noexcept;
    constexpr explicit operator bool() const noexcept;
    // 修飾子
    constexpr pointer release() noexcept;
    template<class U>
    constexpr void reset(U p) noexcept;
    constexpr void reset(nullptr_t = nullptr) noexcept;
    constexpr void swap(unique_ptr& u) noexcept;
    // lvalueからのコピーを無効化
    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:
    // 特殊メンバ関数の仕様について
    const char* what() const noexcept override;
  };
}

クラステンプレート 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;
    size_t owner_hash() const noexcept;
    template<class U>
    bool owner_equal(const shared_ptr<U>& b) const noexcept;
    template<class U>
    bool owner_equal(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;
    size_t owner_hash() const noexcept;
    template<class U>
    bool owner_equal(const shared_ptr<U>& b) const noexcept;
    template<class U>
    bool owner_equal(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 = /* 未指定 */;
  };
}

Class std::owner_hash

namespace std {
  struct owner_hash
  {
    template<class T>
    size_t operator()(const shared_ptr<T>&) const noexcept;
    template<class T>
    size_t operator()(const weak_ptr<T>&) const noexcept;
    using is_transparent = /* 未指定 */;
  };
}

クラス std::owner_equal

namespace std {
  struct owner_equal
  {
    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::atomic std::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::atomic std::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:: inout_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;        // 説明専用
  };
}

クラステンプレート std :: indirect

namespace std {
  template<class T, class Allocator = allocator<T>>
  class indirect
  {
  public:
    using value_type     = T;
    using allocator_type = Allocator;
    using pointer        = typename allocator_traits<Allocator>::ポインタ;
    using const_pointer  = typename allocator_traits<Allocator>::const_pointer;
    // コンストラクタ
    constexpr explicit indirect();
    constexpr explicit indirect(allocator_arg_t, const Allocator& a);
    constexpr indirect(const indirect& other);
    constexpr indirect(allocator_arg_t, const Allocator& a, const indirect& other);
    constexpr indirect(indirect&& other) noexcept;
    constexpr indirect(allocator_arg_t,
                       const Allocator& a,
                       indirect&& other) noexcept(/* 詳細は説明を参照 */);
    template<class U = T>
    constexpr explicit indirect(U&& u);
    template<class U = T>
    constexpr explicit indirect(allocator_arg_t, const Allocator& a, U&& u);
    template<class... Us>
    constexpr explicit indirect(in_place_t, Us&&... us);
    template<class... Us>
    constexpr explicit indirect(allocator_arg_t,
                                const Allocator& a,
                                in_place_t,
                                Us&&... us);
    template<class I, class... Us>
    constexpr explicit indirect(in_place_t, initializer_list<I> ilist, Us&&... us);
    template<class I, class... Us>
    constexpr explicit indirect(allocator_arg_t,
                                const Allocator& a,
                                in_place_t,
                                initializer_list<I> ilist,
                                Us&&... us);
    // デストラクタ
    constexpr ~indirect();
    // assignment
    constexpr indirect& operator=(const indirect& other);
    constexpr indirect& operator=(indirect&& other) noexcept(/* 説明を参照 */);
    template<class U = T>
    constexpr indirect& operator=(U&& u);
    // オブザーバー
    constexpr const T& operator*() const& noexcept;
    constexpr T& operator*() & noexcept;
    constexpr const T&& operator*() const&& noexcept;
    constexpr T&& operator*() && noexcept;
    constexpr const_pointer operator->() const noexcept;
    constexpr pointer operator->() noexcept;
    constexpr bool valueless_after_move() const noexcept;
    constexpr allocator_type get_allocator() const noexcept;
    // swap
    constexpr void swap(indirect& other) noexcept(/* 説明を参照 */);
    friend constexpr void swap(indirect& lhs,
                               indirect& rhs) noexcept(/* 説明を参照 */);
    // 関係演算子
    template<class U, class AA>
    friend constexpr bool operator==(
      const indirect& lhs,
      const indirect<U, AA>& rhs) noexcept(/* 説明を参照 */);
    template<class U, class AA>
    friend constexpr auto operator<=>(const indirect& lhs, const indirect<U, AA>& rhs)
      -> /*synth-three-way-result*/<T, U>;
    // Tとの比較
    template<class U>
    friend constexpr bool operator==(const indirect& lhs,
                                     const U& rhs) noexcept(/* 説明を参照 */);
    template<class U>
    friend constexpr auto operator<=>(const indirect& lhs, const U& rhs)
      -> /*synth-three-way-result*/<T, U>;
  private:
    pointer /*p*/;                     // 説明専用
    Allocator /*alloc*/ = Allocator(); // 説明専用
  };
  template<class Value>
  indirect(Value) -> indirect<Value>;
  template<class Allocator, class Value>
  indirect(allocator_arg_t, Allocator, Value)
    -> indirect<Value,
                typename allocator_traits<Allocator>::template rebind_alloc<Value>>;
}

クラステンプレート std :: polymorphic

namespace std {
  template<class T, class Allocator = allocator<T>>
  class polymorphic
  {
  public:
    using value_type     = T;
    using allocator_type = Allocator;
    using pointer        = typename allocator_traits<Allocator>::pointer;
    using const_pointer  = typename allocator_traits<Allocator>::const_pointer;
    // コンストラクタ
    constexpr explicit polymorphic();
    constexpr explicit polymorphic(allocator_arg_t, const Allocator& a);
    constexpr polymorphic(const polymorphic& other);
    constexpr polymorphic(allocator_arg_t, const Allocator& a, const polymorphic& other);
    constexpr polymorphic(polymorphic&& other) noexcept;
    constexpr polymorphic(allocator_arg_t,
                          const Allocator& a,
                          polymorphic&& other) noexcept(/* 説明を参照 */);
    template<class U = T>
    constexpr explicit polymorphic(U&& u);
    template<class U = T>
    constexpr explicit polymorphic(allocator_arg_t, const Allocator& a, U&& u);
    template<class U, class... Ts>
    constexpr explicit polymorphic(in_place_type_t<U>, Ts&&... ts);
    template<class U, class... Ts>
    constexpr explicit polymorphic(allocator_arg_t,
                                   const Allocator& a,
                                   in_place_type_t<U>,
                                   Ts&&... ts);
    template<class U, class I, class... Us>
    constexpr explicit polymorphic(in_place_type_t<U>,
                                   initializer_list<I> ilist,
                                   Us&&... us);
    template<class U, class I, class... Us>
    constexpr explicit polymorphic(allocator_arg_t,
                                   const Allocator& a,
                                   in_place_type_t<U>,
                                   initializer_list<I> ilist,
                                   Us&&... us);
    // デストラクタ
    constexpr ~polymorphic();
    // 代入
    constexpr polymorphic& operator=(const polymorphic& other);
    constexpr polymorphic& operator=(polymorphic&& other) noexcept(/* 説明を参照 */);
    // オブザーバ
    constexpr const T& operator*() const noexcept;
    constexpr T& operator*() noexcept;
    constexpr const_pointer operator->() const noexcept;
    constexpr pointer operator->() noexcept;
    constexpr bool valueless_after_move() const noexcept;
    constexpr allocator_type get_allocator() const noexcept;
    // スワップ
    constexpr void swap(polymorphic& other) noexcept(/* 説明を参照 */);
    friend constexpr void swap(polymorphic& lhs,
                               polymorphic& rhs) noexcept(/* 説明を参照 */);
  private:
    Allocator /*alloc*/ = Allocator(); // 説明専用
  };
}