Namespaces
Variants

std:: is_layout_compatible

From cppreference.net
Metaprogramming library
Type traits
Type categories
(C++11)
(C++11) ( DR* )
Type properties
(C++11)
(C++11)
(C++14)
(C++11) (deprecated in C++26)
(C++11) ( until C++20* )
(C++11) (deprecated in C++20)
(C++11)
Type trait constants
Metafunctions
(C++17)
Supported operations
Relationships and property queries
Type modifications
Type transformations
(C++11) (deprecated in C++23)
(C++11) (deprecated in C++23)
(C++11)
(C++11) ( until C++20* ) (C++17)

Compile-time rational arithmetic
Compile-time integer sequences
ヘッダーで定義 <type_traits>
template < class T, class U >
struct is_layout_compatible ;
(C++20以降)

T U レイアウト互換 型である場合、メンバー定数 value true に設定します。それ以外の場合、 value false となります。

すべての型は、オブジェクト型でない場合でも、その任意のCV修飾バージョンとレイアウト互換性があります。

T または U が完全型でない場合、(possibly cv-qualified) 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 signed char とも unsigned char ともレイアウト互換ではありません。

Similar types は、トップレベルの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 // 注 [1]
);
// [1] MSVCは誤ってこのアサートに失敗します
int main() {}

関連項目

型が standard-layout 型かどうかをチェックする
(クラステンプレート)