std:: is_pointer_interconvertible_with_class
| Type traits | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Compile-time rational arithmetic | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Compile-time integer sequences | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
(C++14)
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
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
|
(C++11)
|
prüft, ob ein Typ ein
Standard-Layout
Typ ist
(Klassentemplate) |
|
(C++11)
|
prüft, ob ein Typ ein Zeiger auf nicht-statisches Memberobjekt ist
(Klassentemplate) |