Namespaces
Variants

std:: has_unique_object_representations

From cppreference.net
Metaprogramming library
Type traits
Type categories
(C++11)
(C++11) ( DR* )
Type properties
(C++11)
(C++11)
(C++14)
(C++11) (deprecated in C++26)
(C++11) ( until C++20* )
(C++11) (deprecated in C++20)
(C++11)
has_unique_object_representations
(C++17)
Type trait constants
Metafunctions
(C++17)
Supported operations
Relationships and property queries
Type modifications
Type transformations
(C++11) (deprecated in C++23)
(C++11) (deprecated in C++23)
(C++11)
(C++11) ( until C++20* ) (C++17)

Compile-time rational arithmetic
Compile-time integer sequences
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 =

has_unique_object_representations < T > :: value ;
(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

comprueba si un tipo es un tipo de standard-layout
(plantilla de clase)
(C++11)
objeto función hash
(plantilla de clase)