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
Definiert im Header <type_traits>
template < class T, class U >
struct is_layout_compatible ;
(seit C++20)

Wenn T und U layout-kompatible Typen sind, liefert die Member-Konstante value den Wert true . Andernfalls ist value gleich false .

Jeder Typ ist layout-kompatibel mit seinen beliebigen cv-qualifizierten Versionen, selbst wenn es sich nicht um einen Objekttyp handelt.

Wenn T oder U kein vollständiger Typ ist, (möglicherweise cv-qualifiziert) void , oder ein Array unbekannter Größe, ist das Verhalten undefiniert.

Wenn eine Instanziierung einer Vorlage oben direkt oder indirekt von einem unvollständigen Typ abhängt und diese Instanziierung ein anderes Ergebnis liefern könnte, wenn dieser Typ hypothetisch vervollständigt würde, ist das Verhalten undefiniert.

Wenn das Programm Spezialisierungen für std::is_layout_compatible oder std::is_layout_compatible_v hinzufügt, ist das Verhalten undefiniert.

Inhaltsverzeichnis

Hilfsvariablen-Template

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

Geerbt von std:: integral_constant

Member-Konstanten

value
[static]
true falls T und U layout-kompatibel sind, false andernfalls
(öffentliche statische Member-Konstante)

Member-Funktionen

operator bool
konvertiert das Objekt zu bool , gibt value zurück
(öffentliche Member-Funktion)
operator()
(C++14)
gibt value zurück
(öffentliche Member-Funktion)

Member-Typen

Typ Definition
value_type bool
type std:: integral_constant < bool , value >

Hinweise

Ein vorzeichenbehafteter Ganzzahltyp und sein vorzeichenloses Gegenstück sind nicht layoutkompatibel. char ist weder layoutkompatibel mit signed char noch mit unsigned char .

Ähnliche Typen sind nicht layout-kompatibel, wenn sie nach Ignorieren der obersten CV-Qualifizierung nicht denselben Typ darstellen.

Ein Aufzählungstyp und sein zugrunde liegender Typ sind nicht layoutkompatibel.

Array-Typen mit layoutkompatiblen, aber unterschiedlichen Elementtypen (unter Ignorierung von CV-Qualifizierern) sind nicht layoutkompatibel, selbst wenn sie gleich lang sind.

Feature-Test Makro Wert Std Feature
__cpp_lib_is_layout_compatible 201907L (C++20) std::is_layout_compatible

Beispiel

#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  und
    std::is_layout_compatible_v<Foo, Bar>                  == true  und
    std::is_layout_compatible_v<Foo[2], Bar[2]>            == false und
    std::is_layout_compatible_v<int, E0>                   == false und
    std::is_layout_compatible_v<E0, E1>                    == true  und
    std::is_layout_compatible_v<long, unsigned long>       == false und
    std::is_layout_compatible_v<char*, const char*>        == false und
    std::is_layout_compatible_v<char*, char* const>        == true  und
    std::is_layout_compatible_v<Foo, FooNua>               == false // Hinweis [1]
);
// [1] MSVC schlägt diese Assertion fälschlicherweise fehl
int main() {}

Siehe auch

prüft, ob ein Typ ein Standard-Layout Typ ist
(Klassen-Template)