std::has_virtual_destructor
Определено в заголовке <type_traits> |
||
|---|---|---|
template< class T > struct has_virtual_destructor; |
(с C++11) |
Это UnaryTypeTrait.
Если T — тип с виртуальным деструктором, то базовым свойством является std::true_type. Для любого другого типа базовым свойством является std::false_type.
Если T — неполный тип класса-необъединения, поведение не определено.
Поведение программы, добавляющей специализации для std::has_virtual_destructor или std::has_virtual_destructor_v, не определено.
Параметры шаблона
| T | - | тип для проверки |
Вспомогательный шаблон переменной
template< class T > inline 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++.
| DR | Применено к | Поведение, как опубликовано | Правильное поведение |
|---|---|---|---|
| LWG 2015 | C++11 | поведение не определено, еслиT — неполный тип объединения |
базовое свойствоstd::false_type в этом случае |
См. также
|
(C++11)(C++11)(C++11) |
проверяет, имеет ли тип не удалённый деструктор (шаблон класса) |
|
(C++11) |
проверяет, является ли тип полиморфным типом класса (шаблон класса) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/types/has_virtual_destructor