std:: is_pointer_interconvertible_base_of
|
Definido en el encabezado
<type_traits>
|
||
|
template
<
class
Base,
class
Derived
>
struct is_pointer_interconvertible_base_of ; |
(desde C++20) | |
Si
Derived
se deriva inequívocamente de
Base
y cada objeto
Derived
es
intercambiable por puntero
con su subobjeto
Base
, o si ambos son la misma clase no-union (en ambos casos ignorando calificadores cv), proporciona la constante miembro
value
igual a
true
. De lo contrario
value
es
false
.
Si tanto
Base
como
Derived
son tipos de clase no unión, y no son del mismo tipo (ignorando calificadores cv),
Derived
debe ser un
tipo completo
; de lo contrario, el comportamiento es indefinido.
Si el programa añade especializaciones para
std::is_pointer_interconvertible_base_of
o
std::is_pointer_interconvertible_base_of_v
, el comportamiento es indefinido.
Contenidos |
Plantilla de variable auxiliar
|
template
<
class
Base,
class
Derived
>
inline
constexpr
bool
is_pointer_interconvertible_base_of_v
=
|
(desde C++20) | |
Heredado de std:: integral_constant
Constantes miembro
|
value
[static]
|
true
si
Derived
se deriva inequívocamente de
Base
y cada objeto
Derived
es
pointer-interconvertible
con su subobjeto
Base
, o si ambos son la misma clase no-union (en ambos casos ignorando calificadores cv),
false
en caso contrario
(constante miembro pública estática) |
Funciones miembro
|
operator bool
|
convierte el objeto a
bool
, devuelve
value
(función miembro pública) |
|
operator()
(C++14)
|
devuelve
value
(función miembro pública) |
Tipos miembro
| Tipo | Definición |
value_type
|
bool |
type
|
std:: integral_constant < bool , value > |
Notas
std
::
is_pointer_interconvertible_base_of_v
<
T, U
>
puede ser
true
incluso si
T
es una clase base privada o protegida de
U
.
Sea
-
Usea un tipo de objeto completo, -
Tsea un tipo de objeto completo con calificación cv no menor queU, -
usea cualquier lvalue válido deU,
reinterpret_cast < T & > ( u ) siempre tiene un resultado bien definido si std :: is_pointer_interconvertible_base_of_v < T, U > es true .
Si
T
y
U
no son del mismo tipo (ignorando calificadores cv) y
T
es una clase base intercambiable por puntero de
U
, entonces tanto
std::
is_standard_layout_v
<
T
>
como
std::
is_standard_layout_v
<
U
>
son
true
.
Si
T
es un tipo de clase de diseño estándar, entonces todas las clases base de
T
(si existen) son clases base puntero-interconvertibles de
T
.
| Macro de prueba de características | Valor | Std | Característica |
|---|---|---|---|
__cpp_lib_is_pointer_interconvertible
|
201907L
|
(C++20) |
Rasgos de interconvertibilidad de punteros:
|
Ejemplo
#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() {}
Véase también
|
(C++11)
|
verifica si un tipo es una base de otro tipo
(class template) |
|
(C++11)
|
verifica si un tipo es un tipo clase (pero no unión) y no tiene miembros de datos no estáticos
(class template) |
|
(C++11)
|
verifica si un tipo es un tipo de
diseño estándar
(class template) |