Namespaces
Variants

std:: inout_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 inout_ptr_t ;
(C++23以降)

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

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

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

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

Smart がポインタ型でない場合、 release ( ) は適合オブジェクトに対して最大1回呼び出されます。実装はコンストラクタ内で、または Pointer 値がnullでない場合にデストラクタ内でリセットする前に release ( ) を呼び出す可能性があります。

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

目次

テンプレートパラメータ

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

特殊化

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

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

メンバー関数

inout_ptr_t を構築する
(公開メンバ関数)
operator=
[削除済み] (C++23)
inout_ptr_t は代入不可
(公開メンバ関数)
所有権を解放した後に適合スマートポインタをリセットする
(公開メンバ関数)
inout_ptr_t を出力用ストレージのアドレスに変換する
(公開メンバ関数)

非メンバー関数

(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;

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

キャプチャされた引数は通常、 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++23)
外部ポインタ設定子と相互運用し、スマートポインタを破棄時にリセットする
(クラステンプレート)
(C++11)
一意のオブジェクト所有権セマンティクスを持つスマートポインタ
(クラステンプレート)
(C++11)
共有オブジェクト所有権セマンティクスを持つスマートポインタ
(クラステンプレート)