Namespaces
Variants

std:: is_layout_compatible

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)
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, class U >
struct is_layout_compatible ;
(depuis C++20)

Si T et U sont des types layout-compatibles , fournit la constante membre value égale à true . Sinon value est false .

Chaque type est compatible en disposition avec ses versions éventuellement qualifiées cv, même s'il ne s'agit pas d'un type objet.

Si T ou U n'est pas un type complet, (éventuellement qualifié cv) void , ou un tableau de limite inconnue, le comportement est indéfini.

Si l'instanciation d'un template ci-dessus dépend, directement ou indirectement, d'un type incomplet, et que cette instanciation pourrait produire un résultat différent si ce type était hypothétiquement complété, le comportement est indéfini.

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

Table des matières

Modèle de variable d'assistance

template < class T, class U >
constexpr bool is_layout_compatible_v = is_layout_compatible < T, U > :: value ;
(depuis C++20)

Hérité de std:: integral_constant

Constantes membres

value
[static]
true si T et U sont compatibles en mémoire, 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

Un type entier signé et sa contrepartie non signée ne sont pas compatibles en mémoire. char n'est compatible en mémoire ni avec signed char ni avec unsigned char .

Types similaires ne sont pas compatibles en mémoire s'ils ne sont pas le même type après avoir ignoré les qualifications cv de plus haut niveau.

Un type énumération et son type sous-jacent ne sont pas compatibles de disposition.

Les types de tableaux ayant des types d'éléments compatibles en disposition mais différents (en ignorant les qualifications cv) ne sont pas compatibles en disposition, même s'ils sont de longueur égale.

Macro de test de fonctionnalité Valeur Std Fonctionnalité
__cpp_lib_is_layout_compatible 201907L (C++20) std::is_layout_compatible

Exemple

#include <iomanip>
#include <iostream>
#include <type_traits>
struct Foo
{
    int x;
    char y;
};
struct FooNua
{
    int x;
    [[no_unique_address]] char y;
};
class Bar
{
    const int u = 42;
    volatile char v = '*';
};
enum E0 : int {};
enum class E1 : int {};
static_assert
(
    std::is_layout_compatible_v<const void, volatile void> == true  and
    std::is_layout_compatible_v<Foo, Bar>                  == true  and
    std::is_layout_compatible_v<Foo[2], Bar[2]>            == false and
    std::is_layout_compatible_v<int, E0>                   == false and
    std::is_layout_compatible_v<E0, E1>                    == true  and
    std::is_layout_compatible_v<long, unsigned long>       == false and
    std::is_layout_compatible_v<char*, const char*>        == false and
    std::is_layout_compatible_v<char*, char* const>        == true  and
    std::is_layout_compatible_v<Foo, FooNua>               == false // Note [1]
);
// [1] MSVC échoue erronément sur cette assertion
int main() {}

Voir aussi

vérifie si un type est un type à standard-layout
(modèle de classe)