Namespaces
Variants

std:: has_virtual_destructor

From cppreference.net
Metaprogramming library
Type traits
Type categories
(C++11)
(C++11) ( DR* )
Type properties
(C++11)
(C++11)
(C++14)
(C++11) (deprecated in C++26)
(C++11) ( until C++20* )
(C++11) (deprecated in C++20)
(C++11)
Type trait constants
Metafunctions
(C++17)
Supported operations
Relationships and property queries
Type modifications
Type transformations
(C++11) (deprecated in C++23)
(C++11) (deprecated in C++23)
(C++11)
(C++11) ( until C++20* ) (C++17)

Compile-time rational arithmetic
Compile-time integer sequences
Definido en el encabezado <type_traits>
template < class T >
struct has_virtual_destructor ;
(desde C++11)

std::has_virtual_destructor es un UnaryTypeTrait .

Si T es un tipo con un destructor virtual, la característica base es std::true_type . Para cualquier otro tipo, la característica base es std::false_type .

Si T es un tipo de clase no unión incompleto, el comportamiento es indefinido.

Si el programa añade especializaciones para std::has_virtual_destructor o std::has_virtual_destructor_v , el comportamiento es indefinido.

Contenidos

Parámetros de plantilla

T - un tipo a verificar

Plantilla de variable auxiliar

template < class T >
constexpr bool has_virtual_destructor_v = has_virtual_destructor < T > :: value ;
(desde C++17)

Heredado de std:: integral_constant

Constantes miembro

value
[static]
true si T tiene un destructor virtual, false en caso contrario
(constante miembro pública estática)

Funciones miembro

operator bool
convierte el objeto a bool , devuelve value
(función miembro pública)
operator()
(C++14)
devuelve value
(función miembro pública)

Tipos miembro

Tipo Definición
value_type bool
type std:: integral_constant < bool , value >

Notas

Si una clase C tiene un destructor virtual público, puede ser derivada, y el objeto derivado puede ser eliminado de forma segura a través de un puntero al objeto base ( GotW #18 ). En este caso, std:: is_polymorphic < C > :: value es true .

Ejemplo

#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;
}

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Applied to Behavior as published Correct behavior
LWG 2015 C++11 el comportamiento era indefinido si
T es un tipo unión incompleto
la característica base es
std::false_type en este caso

Véase también

verifica si un tipo tiene un destructor no eliminado
(plantilla de clase)
verifica si un tipo es un tipo de clase polimórfica
(plantilla de clase)