std::is_layout_compatible
Определён в заголовке <type_traits> | ||
|---|---|---|
template< class T, class U > struct is_layout_compatible; | (начиная с C++20) |
Если T и U являются типами, совместимыми по размещению, предоставляет константу-член value, равную true. В противном случае value — это false.
Каждый тип совместим по размещению с любыми своими 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 (открытая статическая константа-член) |
Функции-члены
|
operator bool | преобразует объект в bool, возвращает value (открытая функция-член) |
|
operator()
(C++14) | возвращает value (открытая функция-член) |
Типы-члены
| Тип | Определение |
|---|---|
value_type | bool |
type | std::integral_constant<bool,value> |
Примечания
Знаковый целочисленный тип и соответствующий ему беззнаковый тип не совместимы по размещению. char не совместим по размещению ни с signedchar, ни с unsignedchar.
Подобные типы не совместимы по размещению, если после игнорирования cv-квалификаторов верхнего уровня они не являются одним и тем же типом.
Тип перечисления и его базовый тип не совместимы по размещению.
Типы массивов с совместимыми по размещению, но различными типами элементов (без учёта cv-квалификаторов) не совместимы по размещению, даже если имеют одинаковую длину.
| Макрос проверки поддержки функции | Значение | Стандарт | Функция |
|---|---|---|---|
__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 // Note [1]
);
// [1] MSVC erroneously fails this assert
int main() {}
См. также
|
(C++11) | проверяет, является ли тип типом стандартного размещения (шаблон класса) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/types/is_layout_compatible