std:: is_pointer_interconvertible_with_class
| Type traits | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Compile-time rational arithmetic | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Compile-time integer sequences | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
(C++14)
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Défini dans l'en-tête
<type_traits>
|
||
|
template
<
class
S,
class
M
>
constexpr bool is_pointer_interconvertible_with_class ( M S :: * mp ) noexcept ; |
(depuis C++20) | |
Étant donné un objet
s
de type
S
, détermine si
s.
*
mp
fait référence à un sous-objet de
s
et si
s
est
pointer-interconvertible
avec son sous-objet
s.
*
mp
. Le programme est mal formé si
S
n'est pas un
type complet
.
Si
S
n'est pas un
StandardLayoutType
, ou si
M
n'est pas un type objet, ou si
mp
est égal à
nullptr
, le résultat est toujours
false
.
Table des matières |
Paramètres
| mp | - | un pointeur-sur-membre à détecter |
Valeur de retour
true
si
s.
*
mp
fait référence à un sous-objet de
s
et
s
est pointer-interconvertible avec son sous-objet
s.
*
mp
, sinon
false
, où
s
est un objet de type
S
.
Notes
Le type d'une expression pointeur-sur-membre
&
S
::
m
n'est pas toujours
M S
::
*
, où
m
est de type
M
, car
m
peut être un membre hérité d'une classe de base de
S
. Les arguments template peuvent être spécifiés pour éviter des résultats potentiellement surprenants.
S'il existe une valeur
mp
de type
M S
::
*
telle que
std
::
is_pointer_interconvertible_with_class
(
mp
)
==
true
, alors
reinterpret_cast
<
M
&
>
(
s
)
a un résultat bien défini et il fait référence au même sous-objet que
s.
*
mp
, où
s
est une lvalue valide de type
S
.
Sur les plateformes courantes, le motif de bits de
mp
est entièrement nul si
std
::
is_pointer_interconvertible_with_class
(
mp
)
==
true
.
| Macro de test de fonctionnalité | Valeur | Std | Fonctionnalité |
|---|---|---|---|
__cpp_lib_is_pointer_interconvertible
|
201907L
|
(C++20) |
Traits d'interconvertibilité de pointeurs :
|
Exemple
#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() { }
Voir aussi
|
(C++11)
|
vérifie si un type est un type à
standard-layout
(modèle de classe) |
|
(C++11)
|
vérifie si un type est un pointeur vers un membre objet non statique
(modèle de classe) |