std:: out_ptr_t
|
ヘッダーで定義
<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
の特殊化は、プライマリテンプレートの要件を満たす必要はありません。
このライセンスは、プログラム定義の特殊化が非標準スマートポインタ内に格納された生ポインタを外部関数に公開することを許可します。
メンバー関数
|
(C++23)
|
out_ptr_t
を構築する
(public member function) |
|
operator=
[deleted]
(C++23)
|
out_ptr_t
は代入不可
(public member function) |
|
(C++23)
|
適応されたスマートポインタをリセットする
(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;
`タグ内の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++23)
|
外部ポインタ設定機能と相互運用し、スマートポインタから初期ポインタ値を取得し、破棄時にリセットする
(クラステンプレート) |
|
(C++11)
|
一意のオブジェクト所有権セマンティクスを持つスマートポインタ
(クラステンプレート) |
|
(C++11)
|
共有オブジェクト所有権セマンティクスを持つスマートポインタ
(クラステンプレート) |