// 単一オブジェクト版
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) :
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
関連項目
参照
- LWG Issue 938.
default_delete<T[]>::operator()should only acceptT*- C++11で、配列版に、
T*以外のポインタを受け取る(3)のオーバーロードがdelete指定で追加された
- C++11で、配列版に、
- LWG Issue 1193.
default_deletecannot be instantiated with incomplete types - N4089 Safe conversions in
unique_ptr<T[]>, revision 2- C++17で、配列版の(2)と(3)が、制約付きのテンプレートである(4)へ置き換えられた
- P2273R3 Making
std::unique_ptrconstexpr- C++23で、この関数が
constexpr対応した
- C++23で、この関数が