最終更新日時: 2025年10月14日 14時41分25秒 (JST)
Akira Takahashi が更新

履歴 編集

function
<memory>

# std::inout_ptr_t::デストラクタ(C++23)

    ~inout_ptr_t();           // (1) C++23
    constexpr ~inout_ptr_t(); // (1) C++26

## 概要

指定した`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`ならば、

      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));
      }

- `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));
      }

- そうでなければ、プログラムは不適格となる。

## バージョン

### 言語

- C++23

### 処理系

- Clang: ??
- GCC: ??
- ICC: ??
- Visual C++: ??

## 関連項目

- `inout_ptr_t()`
- `(constructor)`
- `operator Pointer*`
- `operator void**`

## 参照

- P1132R8 out_ptr - a scalable output pointer abstraction
- LWG Issue 3897. `inout_ptr` will not update raw pointer to 0
- P3037R6 `constexpr std::shared_ptr` and friends