std::is_layout_compatible
Definido en el archivo de encabezado <type_traits> | ||
template<class T, class U > struct is_layout_compatible; | (desde C++20) | |
Si T
y U
son tipos de diseño compatible proporciona la constante miembro value
igual a true. De lo contrario, value
es false.
Todo tipo es de diseño compatible con sus versiones calificadas-cv, incluso si no es un tipo objeto.
T
y U
deberá cada uno ser un tipo completo, (posiblemente calificado-cv) void, o un array de límite desconocido. De lo contrario, el comportamiento está indefinido.
Si la instanciación de una plantilla anterior depende, directa o indirectamente, de un tipo incompleto, y esa instanciación podría generar un resultado distinto si ese tipo hipotéticamente se completara, el comportamiento está indefinido.
El comportamiento de un programa que añade especializaciones para is_layout_compatible
o is_layout_compatible_v
no está definido.
Contenido |
[editar]Plantilla de variable auxiliar
template<class T, class U > inlineconstexprbool is_layout_compatible_v = is_layout_compatible<T, U>::value; | (desde C++20) | |
Heredado de std::integral_constant
Constantes miembro
value [estático] | true si T y U son de diseño compatible, de lo contrario false. (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> |
[editar]Notas
Un tipo entero con signo y su contraparte sin signo no son de diseño compatible. char no es de diseño compatible ni con signedchar ni unsignedchar.
Tipos similares no son de diseño compatible si no son el mismo tipo después de ignorar los calificadores-cv de nivel superior.
Un tipo enumeración y su tipo subyacente no son de diseño compatible.
Tipos array de diseño compatible pero de distintos tipos de elementos (ignorando los calificadores-cv) no son de diseño compatible, incluso si tienen la misma longitud.
[editar]Ejemplo
#include <type_traits>#include <iostream> struct Foo {int x;char y;}; class Bar {constint u =42;volatilechar v ='*';}; enum E0 :int{};enumclass E1 :int{}; int main(){std::cout<<std::boolalpha<< std::is_layout_compatible_v<constvoid, volatilevoid><<'\n'<< std::is_layout_compatible_v<Foo, Bar><<'\n'<< std::is_layout_compatible_v<Foo[2], Bar[2]><<'\n'<< std::is_layout_compatible_v<int, E0><<'\n'<< std::is_layout_compatible_v<E0, E1><<'\n'<< std::is_layout_compatible_v<long, unsignedlong><<'\n'<< std::is_layout_compatible_v<char*, constchar*><<'\n'<< std::is_layout_compatible_v<char*, char*const><<'\n';}
Salida:
true true false false true false false true
[editar]Véase también
(C++11) | Comprueba si un tipo es un tipo de diseño estándar. (plantilla de clase) |