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
Défini dans l'en-tête <type_traits>
template < class T >
struct has_unique_object_representations ;
(depuis C++17)

std::has_unique_object_representations est un UnaryTypeTrait .

Si T est trivialement copiable et si deux objets quelconques de type T ayant la même valeur possèdent la même représentation objet , fournit la constante membre value égale à true . Pour tout autre type, value vaut false .

Aux fins de ce trait, deux tableaux ont la même valeur si leurs éléments ont les mêmes valeurs, deux classes non-union ont la même valeur si leurs sous-objets directs ont la même valeur, et deux unions ont la même valeur si elles ont le même membre actif et la valeur de ce membre est la même.

Il est défini par l'implémentation quels types scalaires satisfont à ce trait, mais les types entiers non signés qui n'utilisent pas de bits de remplissage sont garantis d'avoir des représentations d'objet uniques.

Si std:: remove_all_extents_t < T > est un type incomplet autre que void (éventuellement qualifié cv), le comportement est indéfini.

Si le programme ajoute des spécialisations pour std::has_unique_object_representations ou std::has_unique_object_representations_v , le comportement est indéfini.

Table des matières

Paramètres du modèle

T - un type à vérifier

Modèle de variable d'assistance

template < class T >

constexpr bool has_unique_object_representations_v =

has_unique_object_representations < T > :: value ;
(depuis C++17)

Hérité de std:: integral_constant

Constantes membres

value
[static]
true si T a des représentations d'objet uniques, false sinon
(constante membre publique statique)

Fonctions membres

operator bool
convertit l'objet en bool , retourne value
(fonction membre publique)
operator()
(C++14)
retourne value
(fonction membre publique)

Types membres

Type Définition
value_type bool
type std:: integral_constant < bool , value >

Notes

Ce trait a été introduit pour permettre de déterminer si un type peut être correctement haché en hachant sa représentation objet comme un tableau d'octets.

Macro de test de fonctionnalité Valeur Std Fonctionnalité
__cpp_lib_has_unique_object_representations 201606L (C++17) std::has_unique_object_representations

Exemple

#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()
{
    // Chaque valeur d'un char correspond exactement à une représentation d'objet unique.
    static_assert(std::has_unique_object_representations_v<char>);
    // Pour les flottants IEC 559, l'assertion échoue car la valeur NaN a
    // plusieurs représentations d'objet.
    static_assert(!std::has_unique_object_representations_v<float>);
    // Devrait réussir dans toute implémentation saine car unpadded
    // n'est généralement pas rempli de padding, et std::uint32_t ne peut pas contenir de bits de padding.
    static_assert(std::has_unique_object_representations_v<unpadded>);
    // Échoue dans la plupart des implémentations car des bits de padding sont insérés
    // entre les membres de données c et st pour aligner st sur 16 bits.
    static_assert(!std::has_unique_object_representations_v<likely_padded>);
    // Divergence architecturale notable :
    static_assert(std::has_unique_object_representations_v<bool>);  // x86
 // static_assert(!std::has_unique_object_representations_v<bool>); // ARM
}

Rapports de défauts

Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.

DR Appliqué à Comportement publié Comportement corrigé
LWG 4113 C++17 T pouvait être un tableau de taille inconnue
même si son type d'élément était incomplet
exige que le type d'élément
soit complet

Voir aussi

vérifie si un type est un type standard-layout
(modèle de classe)
(C++11)
objet fonction de hachage
(modèle de classe)