std:: inout_ptr_t
|
ヘッダーで定義
<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
の特殊化は、プライマリテンプレートの要件を満たす必要はありません。
このライセンスは、プログラム定義の特殊化が非標準スマートポインタ内に格納された生ポインタを外部関数に公開することを許可します。
メンバー関数
|
(C++23)
|
inout_ptr_t
を構築する
(公開メンバ関数) |
|
operator=
[削除済み]
(C++23)
|
inout_ptr_t
は代入不可
(公開メンバ関数) |
|
(C++23)
|
所有権を解放した後に適合スマートポインタをリセットする
(公開メンバ関数) |
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)
|
共有オブジェクト所有権セマンティクスを持つスマートポインタ
(クラステンプレート) |