最終更新日時:
が更新

履歴 編集

function
<memory>

std::default_delete::コンストラクタ(C++11)

// 単一オブジェクト版
constexpr default_delete() noexcept = default;                     // (1) C++11

template <class U>
default_delete(const default_delete<U>& other) noexcept;           // (2) C++11
template <class U>
constexpr default_delete(const default_delete<U>& other) noexcept; // (2) C++23

// 配列版 (default_delete<T[]>)
constexpr default_delete() noexcept = default;                       // (3) C++11

template <class U>
default_delete(const default_delete<U[]>& other) noexcept;           // (4) C++17
template <class U>
constexpr default_delete(const default_delete<U[]>& other) noexcept; // (4) C++23

概要

default_deleteオブジェクトを構築する。

  • (1), (3) : デフォルトコンストラクタ
  • (2), (4) : 変換可能な型のdefault_deleteオブジェクトから構築する

テンプレートパラメータ制約

  • (2) : U*T*に暗黙変換可能であること
  • (4) : U(*)[]T(*)[]に変換可能であること

いずれも、満たさない場合はオーバーロード解決に参加しない。

効果

  • (1), (3) : 何もしない
  • (2), (4) : otherからdefault_deleteオブジェクトを構築する

例外

投げない

備考

  • (1), (3) : = defaultで定義されるため、トリビアルなデフォルトコンストラクタである。
  • (4) : 配列版の変換コンストラクタは、C++17で追加された。それ以前は、default_delete<Derived[]>からdefault_delete<Base[]>のような変換ができなかった。

#include <memory>

struct Base {};
struct Derived : Base {};

int main()
{
  // (1) デフォルト構築
  std::default_delete<Derived> d1;

  // (2) 変換可能な型からの構築
  // Derived*はBase*に暗黙変換可能
  std::default_delete<Base> d2 = d1;

  // (3) 配列版のデフォルト構築
  std::default_delete<int[]> d3;

  // (4) 配列版の変換可能な型からの構築
  // const修飾を付加する変換は可能
  std::default_delete<int[]> d4;
  std::default_delete<const int[]> d5 = d4;

  Derived* p = new Derived();
  d2(p);
}

出力

バージョン

言語

  • C++11

関連項目

参照