std:: has_unique_object_representations
|
Definido en el encabezado
<type_traits>
|
||
|
template
<
class
T
>
struct has_unique_object_representations ; |
(desde C++17) | |
std::has_unique_object_representations
es un
UnaryTypeTrait
.
Si
T
es
trivially copyable
y si dos objetos cualesquiera de tipo
T
con el mismo valor tienen la misma
object representation
, proporciona la constante miembro
value
igual a
true
. Para cualquier otro tipo,
value
es
false
.
Para el propósito de este rasgo, dos arreglos tienen el mismo valor si sus elementos tienen los mismos valores, dos clases no-union tienen el mismo valor si sus subobjetos directos tienen el mismo valor, y dos unions tienen el mismo valor si tienen el mismo miembro activo y el valor de ese miembro es el mismo.
Está definido por la implementación qué tipos escalares satisfacen este rasgo, pero unsigned (until C++20) los tipos enteros que no utilizan bits de relleno están garantizados de tener representaciones de objeto únicas.
Si std:: remove_all_extents_t < T > es un tipo incompleto distinto de void (posiblemente calificado con cv), el comportamiento es indefinido.
Si el programa añade especializaciones para
std::has_unique_object_representations
o
std::has_unique_object_representations_v
, el comportamiento es indefinido.
Contenidos |
Parámetros de plantilla
| T | - | un tipo a verificar |
Plantilla de variable auxiliar
|
template
<
class
T
>
constexpr
bool
has_unique_object_representations_v
=
|
(desde C++17) | |
Heredado de std:: integral_constant
Constantes miembro
|
value
[static]
|
true
si
T
tiene representaciones de objeto únicas,
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
Este rasgo fue introducido para hacer posible determinar si un tipo puede ser correctamente hasheado mediante el hashing de su representación de objeto como un arreglo de bytes.
| Macro de prueba de características | Valor | Std | Característica |
|---|---|---|---|
__cpp_lib_has_unique_object_representations
|
201606L
|
(C++17) |
std::has_unique_object_representations
|
Ejemplo
#include <cstdint> #include <type_traits> struct unpadded { std::uint32_t a, b; }; struct likely_padded { std::uint8_t c; std::uint16_t st; std::uint32_t i; }; int main() { // Cada valor de un char corresponde exactamente a una representación de objeto. static_assert(std::has_unique_object_representations_v<char>); // Para floats IEC 559, la aserción falla porque el valor NaN tiene // múltiples representaciones de objeto. static_assert(!std::has_unique_object_representations_v<float>); // Debería tener éxito en cualquier implementación sensata porque unpadded // típicamente no tiene relleno, y std::uint32_t no puede contener bits de relleno. static_assert(std::has_unique_object_representations_v<unpadded>); // Falla en la mayoría de implementaciones porque se insertan bits de relleno // entre los miembros de datos c y st para alinear st a 16 bits. static_assert(!std::has_unique_object_representations_v<likely_padded>); // Notable divergencia arquitectónica: static_assert(std::has_unique_object_representations_v<bool>); // x86 // static_assert(!std::has_unique_object_representations_v<bool>); // ARM }
Informes de defectos
Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.
| DR | Se aplica a | Comportamiento publicado | Comportamiento correcto |
|---|---|---|---|
| LWG 4113 | C++17 |
T
podría ser un array de límite desconocido
incluso si su tipo de elemento es incompleto |
requiere que el tipo de elemento
sea completo |
Véase también
|
(C++11)
|
comprueba si un tipo es un tipo de
standard-layout
(plantilla de clase) |
|
(C++11)
|
objeto función hash
(plantilla de clase) |