Skip to content

Latest commit

 

History

History
87 lines (64 loc) · 2.8 KB

op_destructor.md

File metadata and controls

87 lines (64 loc) · 2.8 KB

デストラクタ

  • 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

処理系

関連項目

参照