std::has_virtual_destructor
| Definiert in der Kopfdatei <type_traits> |
||
| template< class T > struct has_virtual_destructor; |
(seit C++11) | |
std::has_virtual_destructor ist ein UnaryTypeTrait.
Wenn T ein Typ mit einem virtuellen Destruktor ist, ist die Basischarakteristik std::true_type. Für jeden anderen Typ ist die Basischarakteristik std::false_type.
Wenn T ein unvollständiger nicht-union-Klassentyp ist, ist das Verhalten undefiniert.
Wenn das Programm Spezialisierungen für std::has_virtual_destructor oder std::has_virtual_destructor_v hinzufügt, ist das Verhalten undefiniert.
Inhalt |
[bearbeiten] Template-Parameter
| T | - | ein zu prüfender Typ |
[bearbeiten] Hilfsvariablen-Template
| template< class T > constexpr bool has_virtual_destructor_v = has_virtual_destructor<T>::value; |
(seit C++17) | |
Abgeleitet von std::integral_constant
Member-Konstanten
| value [static] |
true, wenn T einen virtuellen Destruktor hat, sonst false.(öffentliche statische Member-Konstante) |
Memberfunktionen
| operator bool |
konvertiert das Objekt zu bool, gibt value zurück (öffentliche Memberfunktion) |
| operator() (C++14) |
gibt value zurück (öffentliche Memberfunktion) |
Membertypen
| Typ | Definition |
value_type
|
bool |
type
|
std::integral_constant<bool, value> |
[edit] Hinweise
Wenn eine Klasse C einen öffentlichen virtuellen Destruktor hat, kann von ihr abgeleitet werden, und das abgeleitete Objekt kann sicher über einen Zeiger auf das Basisobjekt gelöscht werden (GotW #18). In diesem Fall ist std::is_polymorphic<C>::value true.
[edit] Beispiel
#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; }
[edit] Defect reports
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| LWG 2015 | C++11 | Das Verhalten war undefiniert, wennT ein unvollständiger Union-Typ war |
Die Basischarakteristik ist std::false_type in diesem Fall |
[edit] Siehe auch
| (C++11)(C++11)(C++11) |
prüft, ob ein Typ einen nicht-gelöschten Destruktor hat (Klassenvorlage) |
| (C++11) |
prüft, ob ein Typ ein polymorpher Klassentyp ist (Klassenvorlage) |