std:: is_layout_compatible
| Type traits | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Compile-time rational arithmetic | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Compile-time integer sequences | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
(C++14)
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Определено в заголовочном файле
<type_traits>
|
||
|
template
<
class
T,
class
U
>
struct is_layout_compatible ; |
(начиная с C++20) | |
Если
T
и
U
являются
layout-compatible
типами, предоставляет константу-член
value
равную
true
. В противном случае
value
равна
false
.
Каждый тип является layout-совместимым с любыми его cv-квалифицированными версиями, даже если он не является объектным типом.
Если
T
или
U
не являются полными типами, (возможно, cv-квалифицированным)
void
, или массивом неизвестной границы, поведение не определено.
Если создание экземпляра шаблона выше зависит, прямо или косвенно, от неполного типа, и это создание экземпляра может дать другой результат, если бы этот тип был гипотетически завершен, поведение не определено.
Если программа добавляет специализации для
std::is_layout_compatible
или
std::is_layout_compatible_v
, поведение не определено.
Содержание |
Шаблон вспомогательной переменной
|
template
<
class
T,
class
U
>
constexpr bool is_layout_compatible_v = is_layout_compatible < T, U > :: value ; |
(начиная с C++20) | |
Унаследовано от std:: integral_constant
Константы-члены
|
value
[static]
|
true
если
T
и
U
имеют совместимое расположение в памяти,
false
в противном случае
(public static member constant) |
Функции-члены
|
operator bool
|
преобразует объект в
bool
, возвращает
value
(public member function) |
|
operator()
(C++14)
|
возвращает
value
(public member function) |
Типы-члены
| Тип | Определение |
value_type
|
bool |
type
|
std:: integral_constant < bool , value > |
Примечания
Знаковый целочисленный тип и его беззнаковый аналог не являются совместимыми по размещению. char не является совместимым по размещению ни с signed char , ни с unsigned char .
Похожие типы не являются совместимыми по размещению, если они не являются одним и тем же типом после игнорирования cv-квалификаторов верхнего уровня.
Тип перечисления и его базовый тип не являются совместимыми по размещению в памяти.
Типы массивов с совместимым расположением, но разными типами элементов (игнорируя cv-квалификацию) не являются layout-совместимыми, даже если они имеют одинаковую длину.
| Макрос тестирования возможностей | Значение | Стандарт | Возможность |
|---|---|---|---|
__cpp_lib_is_layout_compatible
|
201907L
|
(C++20) |
std::is_layout_compatible
|
Пример
#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 // Примечание [1] ); // [1] MSVC ошибочно не проходит эту проверку int main() {}
Смотрите также
|
(C++11)
|
проверяет, является ли тип
стандартным расположением
(шаблон класса) |