std::is_pointer_interconvertible_with_class
| 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
| (C++11) |
prüft, ob ein Typ ein Standardlayout-Typ ist (Klassenvorlage) |
| (C++11) |
prüft, ob ein Typ ein Zeiger auf ein nicht-statisches Member-Objekt ist (Klassenvorlage) |