名前空間
変種
操作

std::inout_ptr_t

From cppreference.com
< cpp‎ | memory
 
 
メモリ管理ライブラリ
(説明用*)
未初期化メモリのアルゴリズム
(C++17)
(C++17)
(C++17)
制約付き未初期化
メモリアルゴリズム
Cライブラリ

アロケータ
メモリリソース
ガベージコレクションのサポート
(C++11)(C++23まで)
(C++11)(C++23まで)
(C++11)(C++23まで)
(C++11)(C++23まで)
(C++11)(C++23まで)
(C++11)(C++23まで)
未初期化ストレージ
(C++20まで*)
(C++20まで*)
明示的な生存期間管理
 
 
ヘッダ <memory> で定義
template< class Smart, class Pointer, class... Args >
class inout_ptr_t;
(C++23から)

inout_ptr_t は、所有権を Pointer* (通常は `T` 型のオブジェクトに対する `T**`) または void** パラメータ経由でリセットするような外部関数のために、スマートポインタなどの型を適応させるために使用されます。

inout_ptr_t は、構築時に追加の引数をキャプチャし、前述のような外部関数がアクセスする結果のためのストレージを提供し、適応された Smart オブジェクトが保持する所有権を解放し、最終的に破棄される際に、結果とキャプチャされた引数で適応された Smart オブジェクトをリセットします。

inout_ptr_t は、以下の非静的データメンバを持つかのように動作します。

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

Smart がポインタ型でない場合、適応されたオブジェクトに対して release() が最大1回呼び出されます。実装によっては、コンストラクタ内、または破棄時にリセットする前に Pointer の値がヌルでない場合に release() を呼び出すことがあります。

ユーザーは、`Args...` でオブジェクト型または参照型を指定することにより、リセットのための各引数をコピーまたは参照でキャプチャするかどうかを制御できます。

目次

[編集] テンプレートパラメータ

Smart - 適応するオブジェクトの型 (通常はスマートポインタ)。
ポインタ - 外部関数が所有権のリセットのためにアクセスするオブジェクトの型 (通常は生ポインタ)。
Args... - 適応されたオブジェクトのリセットに使用されるキャプチャされた引数の型。
型要件
-
PointerNullablePointer の要件を満たす必要があります。
-
Smartstd::shared_ptr の特殊化である場合、プログラムはコンパイルエラーとなります。

[編集] 特殊化

標準ライブラリのほとんどのクラステンプレートとは異なり、少なくとも1つの プログラム定義型 に依存する inout_ptr_tプログラム定義特殊化 は、プライマリテンプレートの要件を満たす必要はありません。

このライセンスにより、プログラム定義特殊化は、非標準スマートポインタに格納されている生ポインタを外部関数に公開できます。

[編集] メンバ関数

inout_ptr_t を構築します。
(public member function)
operator=
[deleted](C++23)
inout_ptr_t は代入できません。
(public member function)
所有権を解放した後、適応されたスマートポインタをリセットします。
(public member function)
inout_ptr_t を出力用ストレージのアドレスに変換します。
(public member function)

[編集] 非メンバ関数

(C++23)
関連付けられたスマートポインタとリセット引数を持つ inout_ptr_t を作成します
(関数テンプレート) [編集]

[編集] 注記

inout_ptr_t は、外部関数が Pointer の被参照値によって表される所有権を解放し、その後再初期化することを期待します。そのような操作には排他的な所有権が必要なため、std::shared_ptr との併用は禁止されています。

inout_ptr_t の典型的な使用法は、std::inout_ptr によって一時オブジェクトを作成することです。これは、適応されたスマートポインタを即座にリセットします。例えば、int foreign_resetter(T**); で宣言された適切な型のセッター関数と、std::unique_ptr<T, D> up; で宣言されたスマートポインタがあるとします。

if (int ec = foreign_resetter(std::inout_ptr(up)))
    return ec;

はおおよそ等価です。

T *raw_p = up.get();
up.release();
int ec = foreign_resetter(&raw_p);
up.reset(raw_p);
if (ec != 0)
    return ec;

inout_ptr_t オブジェクトを自動ストレージ期間以外の ストレージ期間 で作成することは推奨されません。そのようなコードは、ダングリング参照を生成し、破棄時に未定義の動作を引き起こす可能性が高いためです。

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


機能テストマクロ 規格 機能
__cpp_lib_out_ptr 202106L (C++23) std::out_ptrstd::inout_ptr
202311L (C++26) フリースタンディングなstd::out_ptrstd::inout_ptr

[編集]

[編集] 関連項目

(C++23)
外部のポインタセッターと相互運用し、破棄時にスマートポインタをリセットします
(クラステンプレート) [編集]
オブジェクトの所有権を唯一のものとするセマンティクスを持つスマートポインタ
(クラステンプレート) [編集]
オブジェクトの所有権を共有するセマンティクスを持つスマートポインタ
(クラステンプレート) [編集]
English 日本語 中文(简体) 中文(繁體)