GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • cpprefjp - C++日本語リファレンス
  • GitHub Project

This view

  • Original page
  • New address

GeezerVison is showing cpprefjp.github.io — std::default_delete::operator() - cpprefjp C++日本語リファレンス

  1. リファレンス
  2. memory
  3. default_delete
  4. operator()

最終更新日時: 2026年08月27日 11時39分30秒 (JST)
Akira Takahashi が更新

履歴 編集

function
<memory>

std::default_delete::operator()(C++11)

// 単一オブジェクト版
void operator()(T* ptr) const;                 // (1) C++11
constexpr void operator()(T* ptr) const;       // (1) C++23

// 配列版 (default_delete<T[]>)
void operator()(T* ptr) const;                 // (2) C++11
                                               //     C++14まで
template <class U>
void operator()(U* ptr) const = delete;        // (3) C++11
                                               //     C++14まで

template <class U>
void operator()(U* ptr) const;                 // (4) C++17
template <class U>
constexpr void operator()(U* ptr) const;       // (4) C++23

概要

渡されたポインタが指すオブジェクトを削除する。

  • (1) : deleteによって単一オブジェクトを削除する
  • (2), (4) : delete[]によって配列を削除する
  • (3) : T*以外のポインタを受け取らないようにするための、delete定義されたオーバーロード

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

  • (4) : U(*)[]がT(*)[]に変換可能であること。満たさない場合はオーバーロード解決に参加しない

適格要件

  • (1), (2) : 型Tが完全型であること
  • (4) : 型Uが完全型であること

効果

  • (1) : delete ptr;を呼び出す
  • (2), (4) : delete[] ptr;を呼び出す

戻り値

なし

備考

  • (3) : 配列版にT*へ暗黙変換できる派生クラスのポインタを渡せてしまうと、要素サイズの不一致によりdelete[]が誤った動作をする。これを防ぐため、T*以外を受け取るオーバーロードがdelete定義されていた。
  • (4) : C++17で(2)と(3)がこのオーバーロードに置き換えられた。U(*)[]からT(*)[]への変換 (int[]からconst int[]への変換など) が可能な場合に限って呼び出せるため、delete定義されたオーバーロードを別途用意する必要がなくなった。

例

#include <memory>
#include <iostream>

struct X {
  ~X() { std::cout << "~X()" << std::endl; }
};

int main()
{
  // (1) 単一オブジェクトの削除
  std::default_delete<X> d1;
  d1(new X());

  // (2), (4) 配列の削除
  std::default_delete<X[]> d2;
  d2(new X[2]);
}

出力

~X()
~X()
~X()

バージョン

言語

  • C++11

関連項目

  • default_delete::(constructor)
  • unique_ptr

参照

  • LWG Issue 938. default_delete<T[]>::operator() should only accept T*
    • C++11で、配列版に、T*以外のポインタを受け取る(3)のオーバーロードがdelete指定で追加された
  • LWG Issue 1193. default_delete cannot be instantiated with incomplete types
    • C++11で、クラステンプレート自体は不完全型で実体化してよく、この関数の実行時に完全型であることが要求されると整理された
  • N4089 Safe conversions in unique_ptr<T[]>, revision 2
    • C++17で、配列版の(2)と(3)が、制約付きのテンプレートである(4)へ置き換えられた
  • P2273R3 Making std::unique_ptr constexpr
    • C++23で、この関数がconstexpr対応した
You are visitor 01402520 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.