std:: is_layout_compatible
| Type traits | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Compile-time rational arithmetic | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Compile-time integer sequences | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
(C++14)
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
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
|
(C++11)
|
prüft, ob ein Typ ein
Standard-Layout
Typ ist
(Klassen-Template) |