- memory[meta header]
- std[meta namespace]
- inout_ptr_t[meta class]
- function[meta id-type]
- cpp23[meta cpp]
~inout_ptr_t();
指定したSmart
型スマートポインタが管理するリソースを解放し、レガシーC関数呼び出しにより取得されたポインタ値を格納する。
スマートポインタのリソース解放には、Smart::release()
メンバ関数が利用される。
スマートポインタへのポインタ値格納には、Smart::reset()
メンバ関数、もしくはSmart
オブジェクト構築+ムーブ代入operator=
が利用される。
説明用のSP
型を下記の通り定義する :
Smart::pointer
が有効な型名であればSmart::pointer
- そうでなければ、
Smart::element_type*
が有効な型名であればSmart::element_type*
- そうでなければ、
pointer_traits
<Smart>::element_type*
- そうでなければ、
Pointer
説明用の文release-statement
を下記の通り定義する :
- コンストラクタで
s.release()
を呼び出さない実装であれば、s.release()
- そうでなければ、空文
説明用メンバ変数s
, a
, p
を用いて、以下と同じ効果を持つ :
-
is_pointer_v
<Smart>
がtrue
ならば、if (p) { apply([&](auto&&... args) { s = Smart(static_cast<SP>(p), std::forward<Args>(args)...); }, std::move(a)); }
-
式
s.reset(static_cast<SP>(p),
std::forward
<Args>(args)...)
が適格ならば、if (p) { apply([&](auto&&... args) { release-statement; s.reset(static_cast<SP>(p), std::forward<Args>(args)...); }, std::move(a)); }
- apply[link /reference/tuple/apply.md]
-
is_constructible_v
<Smart, SP, Args...>
がtrue
ならば、if (p) { apply([&](auto&&... args) { release-statement; s = Smart(static_cast<SP>(p), std::forward<Args>(args)...); }, std::move(a)); }
- apply[link /reference/tuple/apply.md]
-
そうでなければ、プログラムは不適格となる。
- C++23
- Clang: ??
- GCC: ??
- ICC: ??
- Visual C++: ??