std:: is_pointer_interconvertible_with_class
| Type traits | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Compile-time rational arithmetic | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Compile-time integer sequences | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
(C++14)
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Definido en el encabezado
<type_traits>
|
||
|
template
<
class
S,
class
M
>
constexpr bool is_pointer_interconvertible_with_class ( M S :: * mp ) noexcept ; |
(desde C++20) | |
Dado un objeto
s
de tipo
S
, determina si
s.
*
mp
se refiere a un subobjeto de
s
y
s
es
pointer-interconvertible
con su subobjeto
s.
*
mp
. El programa está mal formado si
S
no es un
complete type
.
Si
S
no es un
StandardLayoutType
, o
M
no es un tipo objeto, o
mp
es igual a
nullptr
, el resultado siempre es
false
.
Contenidos |
Parámetros
| mp | - | un puntero-a-miembro para detectar |
Valor de retorno
true
si
s.
*
mp
se refiere a un subobjeto de
s
y
s
es pointer-interconvertible con su subobjeto
s.
*
mp
, de lo contrario
false
, donde
s
es un objeto de tipo
S
.
Notas
El tipo de una expresión de puntero-a-miembro
&
S
::
m
no siempre es
M S
::
*
, donde
m
es de tipo
M
, porque
m
puede ser un miembro heredado de una clase base de
S
. Los argumentos de plantilla pueden especificarse para evitar resultados potencialmente sorprendentes.
Si existe un valor
mp
de tipo
M S
::
*
tal que
std
::
is_pointer_interconvertible_with_class
(
mp
)
==
true
, entonces
reinterpret_cast
<
M
&
>
(
s
)
tiene un resultado bien definido y se refiere al mismo subobjeto que
s.
*
mp
, donde
s
es un lvalue válido de tipo
S
.
En plataformas comunes, el patrón de bits de
mp
es todo ceros si
std
::
is_pointer_interconvertible_with_class
(
mp
)
==
true
.
| Macro de prueba de características | Valor | Estándar | Característica |
|---|---|---|---|
__cpp_lib_is_pointer_interconvertible
|
201907L
|
(C++20) |
Rasgos de interconvertibilidad de punteros:
|
Ejemplo
#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() { }
Véase también
|
(C++11)
|
comprueba si un tipo es un tipo de
standard-layout
(plantilla de clase) |
|
(C++11)
|
comprueba si un tipo es un puntero a miembro objeto no estático
(plantilla de clase) |