Spec-Zone.ru › C++

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() {}

См. также

is_standard_layout
(C++11)
проверяет, является ли тип типом стандартного размещения
(шаблон класса)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/types/is_layout_compatible

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API