Spec-Zone.ru › C++

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 в этом случае

См. также

is_destructibleis_trivially_destructibleis_nothrow_destructible
(C++11)(C++11)(C++11)
проверяет, имеет ли тип не удалённый деструктор
(шаблон класса)
is_polymorphic
(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

Spec-Zone.ru

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