Namensräume
Varianten
Aktionen

std::is_layout_compatible

Von cppreference.com
< cpp‎ | types
 
 
Metaprogrammierungsbibliothek
Typmerkmale
Typkategorien
(C++11)
(C++11)(DR*)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11) 
(C++11)
(C++11)
Typeneigenschaften
(C++11)
(C++11)
(C++14)
(C++11)(deprecated in C++26)
(C++11)(bis C++20*)
(C++11)(veraltet in C++20)
(C++11)
Typmerkmalskonstanten
Metafunktionen
(C++17)
Unterstützte Operationen
Beziehungen und Eigenschaftsabfragen
Typmodifikationen
(C++11)(C++11)(C++11)
Typentransformationen
(C++11)(veraltet in C++23)
(C++11)(veraltet in C++23)
(C++11)
(C++11)(bis C++20*)(C++17)

(C++11)
(C++11)
(C++17)
Rationale Arithmetik zur Compilezeit
Ganzzahlsequenzen zur Compilezeit
 
Definiert in der Kopfdatei <type_traits>
template< class T, class U >
struct is_layout_compatible;
(seit C++20)

Wenn T und U layout-kompatible Typen sind, stellt sie die Member-Konstante value mit dem Wert true bereit. Andernfalls ist value false.

Jeder Typ ist mit jeder seiner cv-qualifizierten Versionen layout-kompatibel, auch 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 Bindung, ist das Verhalten undefiniert.

Wenn eine Instanziierung einer Vorlage davon 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.

Inhalt

[edit] Hilfsvariablen-Template

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

Abgeleitet von std::integral_constant

Member-Konstanten

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

Memberfunktionen

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

Membertypen

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

[edit] Anmerkungen

Ein vorzeichenbehafteter Ganzzahltyp und seine vorzeichenlose Entsprechung sind nicht layout-kompatibel. char ist weder mit signed char noch mit unsigned char layout-kompatibel.

Ähnliche Typen sind nicht layout-kompatibel, wenn sie nach dem Ignorieren der top-level cv-Qualifizierung nicht derselbe Typ sind.

Ein Aufzählungstyp und sein zugrundeliegender Typ sind nicht layout-kompatibel.

Arraytypen mit layout-kompatiblen, aber unterschiedlichen Elementtypen (unter Ignorierung der cv-Qualifizierung) sind nicht layout-kompatibel, selbst wenn sie gleich lang sind.

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

[edit] 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  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 erroneously fails this assert
 
int main() {}

[edit] Siehe auch

prüft, ob ein Typ ein Standardlayout-Typ ist
(Klassenvorlage) [bearbeiten]