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 |
См. также
|
(C++11)(C++11)(C++11) | проверяет, есть ли у типа не удалённый деструктор (шаблон класса) |
|
(C++11) | проверяет, является ли тип полиморфным типом класса (шаблон класса) |
|
(C++26) | проверяет, есть ли у отражённого типа виртуальный деструктор (функция) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/types/has_virtual_destructor