最終更新日時: 2024年06月11日 22時45分38秒 (JST)
Akira Takahashi が更新

履歴 編集

class template
<memory>

# std::default_delete(C++11)

    namespace std {
      // 単一オブジェクト版
      template <class T>
      struct default_delete;

      // 配列版
      template <class T>
      struct default_delete<T[]>;
    }

## 概要

`default_delete`は、リソースを自動的に解放するスマートポインタクラスである`unique_ptr`において、デフォルトで使用されるデリータクラスである。`unique_ptr`が配列を所有できるようにするため、`T[]`時には`delete[]`を呼びだすように特殊化される。

型`T`が不完全型である場合、`operator()`の実行は不適格となる。

## 単一オブジェクト版のメンバ関数

名前 | 説明 | 対応バージョン
--- | --- | ---
`constexpr default_delete() noexcept = default;` | コンストラクタ。 | C++11
`template<class U> default_delete()(default_delete<U> const& other) noexcept;` | 変換可能な型からのコピーコンストラクタ。 | C++11 C++23からconstexpr指定
`~default_delete() = default;` | デストラクタ | C++11
`void operator()(T* ptr) const;` | 関数呼び出し演算子。渡されたポインタ`ptr`を `delete ptr;`で削除する | C++11 C++23からconstexpr指定

## 配列版のメンバ関数

名前 | 説明 | 対応バージョン
--- | --- | ---
`constexpr default_delete() noexcept=default;` | デフォルトコンストラクタ。 | C++11
`template <class U> default_delete()(const default_delete<U[]>&) noexcept;` | 変換可能な型からのコピーコンストラクタ。 | C++17 C++23からconstexpr指定
`~default_delete() = default;` | デストラクタ | C++11
`void operator()(T* ptr) const;` `template <class U>` `void operator()(U*) const = delete;` | 関数呼び出し演算子。渡されたポインタ`ptr`を `delete[] ptr;`で削除する | C++11 C++14まで
`template <class U> void operator()(U* ptr) const;` | 関数呼び出し演算子。渡されたポインタ`ptr`を `delete[] ptr;`で削除する。変換可能な型の配列へのポインタも削除可能。 | C++17 C++23からconstexpr指定

## 例

    #include <memory>

    // default_deleteはunique_ptrのデフォルト引数として自動的に渡されるため、
    // ここでは説明用に明示的にdefault_deleteを指定する

    int main()
    {
      {
        std::unique_ptr<int, std::default_delete<int>> p(new int());
        *p = 3;
      } // pが指しているintオブジェクトがdeleteされる

      {
        std::unique_ptr<int[], std::default_delete<int[]>> p(new int[3]);

        for (std::size_t i = 0; i < 3; ++i) {
          p[i] = i;
        }
      } // pが指しているint配列がdelete[]される
    }

### 出力

## バージョン

### 言語

- C++11

### 処理系

- Clang: ??
- GCC: 4.4 ✅, 4.7.2 ✅
- ICC: ??
- Visual C++: 2010 ✅, 2012 ✅, 2013 ✅

## 参照

- P2273R3 Making `std::unique_ptr` constexpr