std:: is_pointer_interconvertible_base_of
|
Défini dans l'en-tête
<type_traits>
|
||
|
template
<
class
Base,
class
Derived
>
struct is_pointer_interconvertible_base_of ; |
(depuis C++20) | |
Si
Derived
est dérivé de manière non ambiguë de
Base
et que chaque objet
Derived
est
interconvertible par pointeur
avec son sous-objet
Base
, ou si les deux sont la même classe non-union (dans les deux cas en ignorant les qualificatifs cv), fournit la constante membre
value
égale à
true
. Sinon
value
est
false
.
Si les deux
Base
et
Derived
sont des types de classe non-union, et qu'ils ne sont pas du même type (en ignorant les qualifications cv),
Derived
doit être un
type complet
; sinon le comportement est indéfini.
Si le programme ajoute des spécialisations pour
std::is_pointer_interconvertible_base_of
ou
std::is_pointer_interconvertible_base_of_v
, le comportement est indéfini.
Table des matières |
Modèle de variable d'assistance
|
template
<
class
Base,
class
Derived
>
inline
constexpr
bool
is_pointer_interconvertible_base_of_v
=
|
(depuis C++20) | |
Hérité de std:: integral_constant
Constantes membres
|
value
[static]
|
true
si
Derived
est dérivé sans ambiguïté de
Base
et que chaque objet
Derived
est
pointer-interconvertible
avec son sous-objet
Base
, ou si les deux sont la même classe non-union (dans les deux cas en ignorant les qualificateurs cv),
false
sinon
(constante membre publique statique) |
Fonctions membres
|
operator bool
|
convertit l'objet en
bool
, retourne
value
(fonction membre publique) |
|
operator()
(C++14)
|
retourne
value
(fonction membre publique) |
Types membres
| Type | Définition |
value_type
|
bool |
type
|
std:: integral_constant < bool , value > |
Notes
std
::
is_pointer_interconvertible_base_of_v
<
T, U
>
peut être
true
même si
T
est une classe de base privée ou protégée de
U
.
Soit
-
Usoit un type d'objet complet, -
Tsoit un type d'objet complet avec une qualification cv non inférieure àU, -
usoit toute lvalue valide deU,
reinterpret_cast < T & > ( u ) a toujours un résultat bien défini si std :: is_pointer_interconvertible_base_of_v < T, U > est true .
Si
T
et
U
ne sont pas du même type (en ignorant les qualifications cv) et que
T
est une classe de base convertible en pointeur de
U
, alors à la fois
std::
is_standard_layout_v
<
T
>
et
std::
is_standard_layout_v
<
U
>
sont
true
.
Si
T
est un type de classe standard-layout, alors toutes les classes de base de
T
(le cas échéant) sont des classes de base pointer-interconvertibles de
T
.
| 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 {}; struct Bar {}; class Baz : Foo, public Bar { int x; }; class NonStdLayout : public Baz { int y; }; static_assert(std::is_pointer_interconvertible_base_of_v<Bar, Baz>); static_assert(std::is_pointer_interconvertible_base_of_v<Foo, Baz>); static_assert(not std::is_pointer_interconvertible_base_of_v<Baz, NonStdLayout>); static_assert(std::is_pointer_interconvertible_base_of_v<NonStdLayout, NonStdLayout>); int main() {}
Voir aussi
|
(C++11)
|
vérifie si un type est une base d'un autre type
(modèle de classe) |
|
(C++11)
|
vérifie si un type est un type classe (mais pas union) et n'a pas de membres de données non statiques
(modèle de classe) |
|
(C++11)
|
vérifie si un type est un
type standard-layout
(modèle de classe) |