std::is_layout_compatible
| 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
| (C++11) |
prüft, ob ein Typ ein Standardlayout-Typ ist (Klassenvorlage) |