Namensräume
Varianten
Aktionen

std::is_pointer_interconvertible_with_class

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 S, class M >
constexpr bool is_pointer_interconvertible_with_class( M S::* mp ) noexcept;
(seit C++20)

Bestimmt für ein Objekt s vom Typ S, ob s.*mp auf ein Unterobjekt von s verweist und ob s zeiger-interkonvertierbar mit seinem Unterobjekt s.*mp ist. Das Programm ist schlecht geformt, wenn S kein unvollständiger Typ ist.

Wenn S kein StandardLayoutType ist, oder M kein Objekttyp ist, oder mp gleich nullptr ist, ist das Ergebnis immer false.

Inhalt

[edit] Parameter

mp - Ein Zeiger auf ein Mitglied, der überprüft werden soll

[edit] Rückgabewert

true, wenn s.*mp auf ein Unterobjekt von s verweist und s zeiger-interkonvertierbar mit seinem Unterobjekt s.*mp ist, andernfalls false, wobei s ein gültiges Linkswertausdruck vom Typ S ist.

[edit] Hinweise

Der Typ eines Zeiger-auf-Mitglied-Ausdrucks &S::m ist nicht immer M S::*, wobei m vom Typ M ist, da m ein von einer Basisklasse von S geerbtes Mitglied sein kann. Die Template-Argumente können angegeben werden, um potenziell überraschende Ergebnisse zu vermeiden.

Wenn es einen Wert mp vom Typ M S::* gibt, für den std::is_pointer_interconvertible_with_class(mp) == true gilt, dann hat reinterpret_cast<M&>(s) ein wohldefiniertes Ergebnis und verweist auf dasselbe Unterobjekt wie s.*mp, wobei s ein gültiger Linkswertausdruck vom Typ S ist.

Auf gängigen Plattformen ist das Bitmuster von mp Null, wenn std::is_pointer_interconvertible_with_class(mp) == true gilt.

Feature-Test-Makro Wert Std Feature
__cpp_lib_is_pointer_interconvertible 201907L (C++20) Zeiger-Interkonvertibilitäts-Traits

[edit] Beispiel

#include <type_traits>
 
struct Foo { int x; };
struct Bar { int y; };
 
struct Baz : Foo, Bar {}; // not standard-layout
 
static_assert( not std::is_same_v<decltype(&Baz::x), int Baz::*> );
static_assert( std::is_pointer_interconvertible_with_class(&Baz::x) );
static_assert( not std::is_pointer_interconvertible_with_class<Baz, int>(&Baz::x) );
 
int main() { }

[edit] Siehe auch

prüft, ob ein Typ ein Standardlayout-Typ ist
(Klassenvorlage) [bearbeiten]
prüft, ob ein Typ ein Zeiger auf ein nicht-statisches Member-Objekt ist
(Klassenvorlage) [bearbeiten]