std::is_pointer_interconvertible_base_of
| Definiert in der Kopfdatei <type_traits> |
||
| template< class Base, class Derived > struct is_pointer_interconvertible_base_of; |
(seit C++20) | |
Wenn Derived eindeutig von Base abgeleitet ist und jedes Derived-Objekt zeiger-konvertierbar mit seinem Base-Unterobjekt ist, oder wenn beide die gleiche Nicht-Union-Klasse sind (in beiden Fällen unter Ignorierung der cv-Qualifizierung), dann ist das konstante Member value gleich true. Andernfalls ist value false.
Wenn sowohl Base als auch Derived Nicht-Union-Klassentypen sind und nicht denselben Typ haben (unter Ignorierung der cv-Qualifizierung), muss Derived ein vollständiger Typ sein; andernfalls ist das Verhalten undefiniert.
Wenn das Programm Spezialisierungen für std::is_pointer_interconvertible_base_of oder std::is_pointer_interconvertible_base_of_v hinzufügt, ist das Verhalten undefiniert.
Inhalt |
[edit] Hilfsvariablen-Template
| template< class Base, class Derived > inline constexpr bool is_pointer_interconvertible_base_of_v = |
(seit C++20) | |
Abgeleitet von std::integral_constant
Member-Konstanten
| value [static] |
true, wenn Derived eindeutig von Base abgeleitet ist und jedes Derived-Objekt zeiger-konvertierbar mit seinem Base-Unterobjekt ist, oder wenn beide die gleiche Nicht-Union-Klasse sind (in beiden Fällen unter Ignorierung der cv-Qualifizierung), andernfalls 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
std::is_pointer_interconvertible_base_of_v<T, U> kann true sein, auch wenn T eine private oder geschützte Basisklasse von U ist.
Seien
-
Uein vollständiger Objekttyp, -
Tein vollständiger Objekttyp mit einer cv-Qualifizierung, die nicht kleiner als die vonUist, -
uein beliebiges gültiges lvalue vonU,
reinterpret_cast<T&>(u) immer ein wohl-definiertes Ergebnis hat, wenn std::is_pointer_interconvertible_base_of_v<T, U> true ist.
Wenn T und U nicht denselben Typ haben (unter Ignorierung der cv-Qualifizierung) und T eine zeiger-konvertierbare Basisklasse von U ist, dann sind sowohl std::is_standard_layout_v<T> als auch std::is_standard_layout_v<U> true.
Wenn T ein Standardlayout-Klassentyp ist, dann sind alle Basisklassen von T (falls vorhanden) zeiger-konvertierbare Basisklassen von T.
| Feature-Test-Makro | Wert | Std | Feature |
|---|---|---|---|
__cpp_lib_is_pointer_interconvertible |
201907L |
(C++20) | Zeiger-Konvertibilitäts-Traits
|
[edit] Beispiel
#include <type_traits> struct Foo {}; struct Bar {}; class Baz : Foo, public Bar { int x; }; class NonStdLayout : public Baz { int y; }; static_assert(std::is_pointer_interconvertible_base_of_v<Bar, Baz>); static_assert(std::is_pointer_interconvertible_base_of_v<Foo, Baz>); static_assert(not std::is_pointer_interconvertible_base_of_v<Baz, NonStdLayout>); static_assert(std::is_pointer_interconvertible_base_of_v<NonStdLayout, NonStdLayout>); int main() {}
[edit] Siehe auch
| (C++11) |
prüft, ob ein Typ eine Basisklasse des anderen Typs ist (Klassenvorlage) |
| (C++11) |
prüft, ob ein Typ ein Klassentyp (aber keine Union) ist und keine nicht-statischen Datenelemente hat (Klassenvorlage) |
| (C++11) |
prüft, ob ein Typ ein Standardlayout-Typ ist (Klassenvorlage) |