Namespaces
Variants

std:: is_pointer_interconvertible_with_class

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

Gegeben ein Objekt s vom Typ S , bestimmt ob s. * mp auf ein Subobjekt von s verweist und s zeigerinterkonvertierbar mit seinem Subobjekt s. * mp ist. Das Programm ist fehlerhaft, wenn S kein vollständiger Typ ist.

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

Inhaltsverzeichnis

Parameter

mp - ein Zeiger-auf-Mitglied zum Erkennen

Rückgabewert

true falls s. * mp auf ein Unterobjekt von s verweist und s pointer-interconvertible mit seinem Unterobjekt s. * mp ist, andernfalls false , wobei s ein Objekt vom Typ S ist.

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.

Falls es einen Wert mp vom Typ M S :: * gibt, sodass std :: is_pointer_interconvertible_with_class ( mp ) == true , dann hat reinterpret_cast < M & > ( s ) ein wohldefiniertes Ergebnis und es referenziert dasselbe Subobjekt wie s. * mp , wobei s ein gültiger Lvalue vom Typ S ist.

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

Feature-Test Makro Wert Standard Funktion
__cpp_lib_is_pointer_interconvertible 201907L (C++20) Zeiger-Interkonvertierbarkeits-Traits:

Beispiel

#include <type_traits>
struct Foo { int x; };
struct Bar { int y; };
struct Baz : Foo, Bar {}; // nicht 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() { }

Siehe auch

prüft, ob ein Typ ein Standard-Layout Typ ist
(Klassentemplate)
prüft, ob ein Typ ein Zeiger auf nicht-statisches Memberobjekt ist
(Klassentemplate)