最終更新日時:
が更新

履歴 編集

class template
<type_traits>

std::has_virtual_destructor(C++11)

namespace std {
  template <class T>
  struct has_virtual_destructor;

  template <class T>
  constexpr bool has_virtual_destructor_v
    = has_virtual_destructor<T>::value;   // C++17
}

概要

Tが仮想デストラクタを持っているか調べる

要件

Tが非共用体のクラスである場合、その型は完全型でなければならない。

効果

has_virtual_destructorは、型Tが仮想デストラクタを持っていればtrue_typeから派生し、そうでなければfalse_typeから派生する。

#include <type_traits>

struct A {
  ~A() = default;
};

struct B {
  virtual ~B() = default;
};

static_assert(std::has_virtual_destructor<A>::value == false, "A hasn't virtual destructor");
static_assert(std::has_virtual_destructor<B>::value == true,  "B has virtual destructor");

static_assert(std::is_same<std::has_virtual_destructor<A>::type, std::false_type>::value, "B hasn't virtual destructor");
static_assert(std::is_same<std::has_virtual_destructor<B>::type, std::true_type>::value, "B has virtual destructor");

static_assert(std::has_virtual_destructor<int>::value == false, "int hasn't virtual destructor");
static_assert(std::has_virtual_destructor<int[]>::value == false, "array hasn't virtual destructor");
static_assert(std::has_virtual_destructor<void>::value == false, "void hasn't virtual destructor");

int main() {}

出力

バージョン

言語

  • C++11

処理系

参照