// 単一オブジェクト版
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
関連項目
参照
- LWG Issue 854.
default_deleteconverting constructor underspecified- C++11で、(2)が
U*からT*へ暗黙変換可能な場合にのみオーバーロード解決に参加することが規定された
- C++11で、(2)が
- LWG Issue 1517.
default_delete's default constructor should be trivial- C++11で、デフォルトコンストラクタが
= defaultで定義されるようになり、トリビアルになった
- C++11で、デフォルトコンストラクタが
- N4089 Safe conversions in
unique_ptr<T[]>, revision 2- C++17で、配列版に変換コンストラクタ(4)が追加された
- P2273R3 Making
std::unique_ptrconstexpr- C++23で、コンストラクタが
constexpr対応した
- C++23で、コンストラクタが