Namensräume
Varianten
Aktionen

std::is_pointer_interconvertible_base_of

Von cppreference.com
< cpp‎ | types
 
 
Metaprogrammierungsbibliothek
Typmerkmale
Typkategorien
(C++11)
(C++11)(DR*)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11) 
(C++11)
(C++11)
Typeneigenschaften
(C++11)
(C++11)
(C++14)
(C++11)(deprecated in C++26)
(C++11)(bis C++20*)
(C++11)(veraltet in C++20)
(C++11)
Typmerkmalskonstanten
Metafunktionen
(C++17)
Unterstützte Operationen
Beziehungen und Eigenschaftsabfragen
Typmodifikationen
(C++11)(C++11)(C++11)
Typentransformationen
(C++11)(veraltet in C++23)
(C++11)(veraltet in C++23)
(C++11)
(C++11)(bis C++20*)(C++17)

(C++11)
(C++11)
(C++17)
Rationale Arithmetik zur Compilezeit
Ganzzahlsequenzen zur Compilezeit
 
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 =

    is_pointer_interconvertible_base_of<Base, Derived>::value;
(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

  • U ein vollständiger Objekttyp,
  • T ein vollständiger Objekttyp mit einer cv-Qualifizierung, die nicht kleiner als die von U ist,
  • u ein beliebiges gültiges lvalue von U,

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

prüft, ob ein Typ eine Basisklasse des anderen Typs ist
(Klassenvorlage) [bearbeiten]
(C++11)
prüft, ob ein Typ ein Klassentyp (aber keine Union) ist und keine nicht-statischen Datenelemente hat
(Klassenvorlage) [bearbeiten]
prüft, ob ein Typ ein Standardlayout-Typ ist
(Klassenvorlage) [bearbeiten]