Namespaces
Variants

std:: out_ptr_t

From cppreference.net
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
ヘッダーで定義 <memory>
template < class Smart, class Pointer, class ... Args >
class out_ptr_t ;
(C++23以降)

out_ptr_t は、スマートポインタなどの型を、結果を Pointer* (通常は何らかのオブジェクト型 T に対して T** )または void ** パラメータを介して出力する外部関数向けに適合させるために使用されます。

out_ptr_t は構築時に追加の引数を捕捉し、前述の外部関数が結果を書き込むためのストレージを提供し、最終的に破棄される際に、結果と捕捉された引数を用いて適応された Smart オブジェクトをリセットします。

out_ptr_t は以下の非静的データメンバーを保持するかのように振る舞います:

  • a Smart& 参照。これは構築時に適応されたオブジェクトにバインドされます。
  • すべての Args... 内の T について、型 T のメンバ。これは構築時にキャプチャされた引数で、破棄時のリセットに使用されます。
  • Pointer を格納するのに適したメンバ副オブジェクト。これは void * オブジェクトを提供します。ここで Pointer または void * オブジェクトは、一般的に再初期化のために外部関数に公開されます。

ユーザーは、リセットの各引数がコピーでキャプチャされるか参照でキャプチャされるかを、 Args... でそれぞれオブジェクト型または参照型を指定することで制御できます。

目次

テンプレートパラメータ

Smart - アダプトするオブジェクトの型(通常スマートポインタ)
Pointer - 外部関数が結果を書き込むオブジェクトの型(通常生ポインタ)
Args... - アダプト対象オブジェクトのリセットに使用されるキャプチャされた引数の型
型要件
-
Pointer NullablePointer の要件を満たさなければならない
-
Smart std::shared_ptr の特殊化であり、かつ sizeof... ( Args ) == 0 の場合、プログラムは不適格である

特殊化

標準ライブラリのほとんどのクラステンプレートとは異なり、 program-defined specializations のうち、少なくとも1つの program-defined type に依存する out_ptr_t の特殊化は、プライマリテンプレートの要件を満たす必要はありません。

このライセンスは、プログラム定義の特殊化が非標準スマートポインタ内に格納された生ポインタを外部関数に公開することを許可します。

メンバー関数

out_ptr_t を構築する
(public member function)
operator=
[deleted] (C++23)
out_ptr_t は代入不可
(public member function)
適応されたスマートポインタをリセットする
(public member function)
out_ptr_t を出力用ストレージのアドレスに変換する
(public member function)

非メンバー関数

(C++23)
関連するスマートポインタとリセット引数を持つ out_ptr_t を作成する
(関数テンプレート)

注記

out_ptr_t は、外部関数が指し示された Pointer の値を使用せず、単に再初期化することを想定しています。アダプション前のスマートポインタの値は使用されません。

out_ptr_t の典型的な使用方法は、 std::out_ptr による一時オブジェクトの作成であり、これにより適応されたスマートポインタが直ちにリセットされます。例: セッター関数と適切な型のスマートポインタがそれぞれ int foreign_setter ( T ** ) ; および std:: unique_ptr < T, D > up ; と宣言されている場合、

int foreign_setter(T**);
std::unique_ptr<T, D> up;
if (int ec = foreign_setter(std::out_ptr(up)))
    return ec;

おおよそ次と同等です

int foreign_setter(T**);
std::unique_ptr<T, D> up;
T* raw_p{};
int ec = foreign_setter(&raw_p);
up.reset(raw_p);
if (ec != 0)
    return ec;
**注記**: 提供されたHTMLコードはC++コードを含んでおり、指示に従って以下の対応を行いました: - HTMLタグと属性は翻訳せず、元のフォーマットを保持 - `
`タグ内のC++コードは翻訳対象外
- C++固有の用語(`foreign_setter`, `unique_ptr`, `reset`など)は翻訳せず
コード自体はC++の構文であり、翻訳の必要はありません。

自動記憶域期間以外の storage duration を持つ out_ptr_t オブジェクトの作成は推奨されません。そのようなコードは参照のダングリングを引き起こし、破棄時の未定義動作を招く可能性が高いためです。

out_ptr_t は、デリータを指定せずに std::shared_ptr をリセットする使用法を禁止します。なぜなら、それは std::shared_ptr::reset を呼び出し、後でカスタムデリータを置き換えることになるからです。

キャプチャされた引数は通常、 std:: tuple < Args... > にパックされます。実装では、保持する必要がある Pointer または void * オブジェクトを提供するために異なるメカニズムを使用する場合があります。

機能テスト マクロ 標準 機能
__cpp_lib_out_ptr 202106L (C++23) std::out_ptr , std::inout_ptr
202311L (C++26) フリースタンディング std::out_ptr および std::inout_ptr

関連項目

外部ポインタ設定機能と相互運用し、スマートポインタから初期ポインタ値を取得し、破棄時にリセットする
(クラステンプレート)
(C++11)
一意のオブジェクト所有権セマンティクスを持つスマートポインタ
(クラステンプレート)
(C++11)
共有オブジェクト所有権セマンティクスを持つスマートポインタ
(クラステンプレート)