最終更新日時:
が更新

履歴 編集

class template
<type_traits>

std::has_virtual_destructor(C++11)

namespace std {
  template <class T>
  struct has_virtual_destructor;
}

概要

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

処理系

参照

  • LWG Issue 2015. Incorrect pre-conditions for some type traits
    • C++11では要件が「型Tは完全型であるか、const/volatile修飾された(あるいはされていない)voidか、要素数不明の配列型でなければならない。」だったが、これは間違いであるため、C++14で「型Tが非共用体のクラスである場合、その型は完全型でなければならない。」に変更された。