Spec-Zone.ru › C++

std::has_virtual_destructor

Определён в заголовочном файле <type_traits>
template< class T >
struct has_virtual_destructor;
(начиная с C++11)

std::has_virtual_destructor — это унарный типовой признак.

Если T — это тип с виртуальным деструктором, базовая характеристика равна std::true_type. Для любого другого типа базовая характеристика равна std::false_type.

Если T — это неполный тип класса, не являющегося объединением, поведение не определено.

Если программа добавляет специализации для std::has_virtual_destructor или std::has_virtual_destructor_v, поведение не определено.

Параметры шаблона

T - тип для проверки

Вспомогательный шаблон переменной

template< class T >
constexpr bool has_virtual_destructor_v = has_virtual_destructor<T>::value;
(начиная с C++17)

Унаследовано от std::integral_constant

Константы-члены

value
[static]
true, если T имеет виртуальный деструктор, иначе false
(общедоступная статическая константа-член)

Функции-члены

operator bool
преобразует объект в bool, возвращает value
(общедоступная функция-член)
operator()
(C++14)
возвращает value
(общедоступная функция-член)

Типы-члены

Тип Определение
value_type bool
type std::integral_constant<bool,value>

Примечания

Если класс C имеет общедоступный виртуальный деструктор, от него можно наследоваться, а производный объект можно безопасно удалить через указатель на базовый объект (GotW #18). В этом случае std::is_polymorphic<C>::value равен true.

Пример

#include <type_traits>

struct S {};
static_assert(!std::has_virtual_destructor_v<S>);

struct B { virtual ~B() {} };
static_assert(std::has_virtual_destructor_v<B>);

struct D : B { ~D() {} };
static_assert(std::has_virtual_destructor_v<D>);

int main()
{
    B* pd = new D;
    delete pd;
}

Отчёты об ошибках

Следующие отчёты об ошибках, изменяющие поведение, были применены задним числом к ранее опубликованным стандартам C++.

Отчёт об ошибке Применён к Поведение согласно опубликованному стандарту Корректное поведение
LWG 2015 C++11 поведение не было определено, если
T — неполный тип объединения
в этом случае базовая характеристика равна
std::false_type

См. также

is_destructibleis_trivially_destructibleis_nothrow_destructible
(C++11)(C++11)(C++11)
проверяет, есть ли у типа не удалённый деструктор
(шаблон класса)
is_polymorphic
(C++11)
проверяет, является ли тип полиморфным типом класса
(шаблон класса)
has_virtual_destructor
(C++26)
проверяет, есть ли у отражённого типа виртуальный деструктор
(функция)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/types/has_virtual_destructor

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API