std::is_destructible、std::is_trivially_destructible、std::is_nothrow_destructible
From cppreference.com
| ヘッダ <type_traits> で定義 |
||
template< class T > struct is_destructible; |
(1) | (C++11以降) |
template< class T > struct is_trivially_destructible; |
(2) | (C++11以降) |
template< class T > struct is_nothrow_destructible; |
(3) | (C++11以降) |
1)
T が参照型の場合、メンバー定数 value は true になります。T が(cv修飾されている可能性のある)void、関数型、または境界不明の配列の場合、value は false になります。T がオブジェクト型の場合、std::remove_all_extents<T>::type という型を U とすると、評価されないコンテキストで式 std::declval<U&>().~U() がwell-formedであれば、value は true になります。そうでなければ、value は false になります。3) (1) と同じですが、デストラクタが noexcept であるかどうかが条件になります。
T が不完全型、(cv修飾されている可能性のある)void、または不明な境界を持つ配列の場合、動作は未定義です。
上記のテンプレートのインスタンス化が、直接的または間接的に不完全な型に依存し、その型が仮に完全になった場合にそのインスタンス化が異なる結果を生み出す可能性がある場合、動作は未定義です。
プログラムがこのページで説明されているテンプレートのいずれかに特殊化を追加する場合、動作は未定義です。
目次 |
[編集] ヘルパー変数テンプレート
| template< class T > constexpr bool is_destructible_v = is_destructible<T>::value; |
(C++17以降) | |
| template< class T > constexpr bool is_trivially_destructible_v = is_trivially_destructible<T>::value; |
(C++17以降) | |
| template< class T > constexpr bool is_nothrow_destructible_v = is_nothrow_destructible<T>::value; |
(C++17以降) | |
std::integral_constant から継承
メンバ定数
| value [static] |
T が破棄可能であれば true、そうでなければ false(公開静的メンバ定数) |
メンバ関数
| operator bool |
オブジェクトを bool に変換し、value を返します。 (public member function) |
| operator() (C++14) |
value を返します。 (public member function) |
メンバ型
| 型 | 定義 |
value_type
|
bool |
type
|
std::integral_constant<bool, value> |
[編集] 注意
デストラクタがスタック展開中に例外をスローした場合(通常は予測不可能)、C++プログラムは終了するため、実用的なデストラクタは noexcept と宣言されていなくても、すべて非スローイングです。C++標準ライブラリに含まれるすべてのデストラクタは非スローイングです。
トリヴィアルに破棄可能なオブジェクトが占めるストレージは、デストラクタを呼び出すことなく再利用されることがあります。
[編集] 実装例
| is_destructible (1) |
|---|
// C++20 required template<typename t> struct is_destructible : std::integral_constant<bool, requires(t object) { object.~t(); }> {}; |
| is_trivially_destructible (2) |
// Not real C++. Shall P2996 be approved, the following implementation will be available: template<typename t> struct is_trivially_destructible : std::integral_constant<bool, std::meta::type_is_trivially_destructible(^t)> {}; |
| is_nothrow_destructible (3) |
// C++20 required template<typename t> struct is_nothrow_destructible : std::integral_constant<bool, requires(t object) { {object.~t()} noexcept; }> {}; |
[編集] 例
このコードを実行
#include <iostream> #include <string> #include <type_traits> struct Foo { std::string str; ~Foo() noexcept {}; }; struct Bar { ~Bar() = default; }; static_assert(std::is_destructible<std::string>::value == true); static_assert(std::is_trivially_destructible_v<Foo> == false); static_assert(std::is_nothrow_destructible<Foo>() == true); static_assert(std::is_trivially_destructible<Bar>{} == true); int main() {}
[編集] 不具合報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 2049 | C++11 | 仮想的なラッパースタクトのため、仕様が完了不可能だった | 完全になった。 |
[編集] 関連項目
| (C++11)(C++11)(C++11) |
型が特定の引数に対するコンストラクタを持つかをチェックする (クラステンプレート) |
| (C++11) |
型が仮想デストラクタを持つかをチェックする (クラステンプレート) |
| (C++20) |
その型のオブジェクトが破棄可能であることを規定する (コンセプト) |
| デストラクタ | 解放されたリソース |