最終更新日時(UTC):
が更新

履歴 編集

class template
<type_traits>

std::is_layout_compatible(C++20)

namespace std {
  template <class T, class U>
  struct is_layout_compatible;

  template <class T, class U>
  inline constexpr bool is_layout_compatible_v
    = is_layout_compatible<T, U>::value;
}

概要

2つの型T, Uにレイアウト互換があるかを判定する。

要件

Tおよび型U完全型であるか、const/volatile修飾された(あるいはされていない)voidか、要素数不明の配列型でなければならない。

効果

is_layout_compatibleは、型Tと型Uにレイアウト互換性があるならばtrue_typeから派生し、そうでなければfalse_typeから派生する

2つの型T0, U0は、トップレベルのconst/volatile修飾を取り除いた型T1, U1が下記条件のいずれかを満たすとき、レイアウト互換な型(layout-compatible type)となる。

  • T1U1が同一の型である。
  • T1U1がレイアウト互換な列挙型(layout-compatible enumerations)である。
    • つまり、2つの列挙型T1, U1基底型が同一の型をもつ。
  • T1U1スタンダードレイアウトかつレイアウト互換なクラス(layout-compatible class)である。
    • つまり、2つのスタンダードレイアウトなクラスT1, U1に含まれる全てのメンバ変数およびビットフィールドが、同一の先頭のメンバの並び(common initial sequence)を構成している。
    • 2つ型の同一の先頭のメンバの並びとは、各クラスにおける非静的メンバ変数およびビットフィールドの宣言順序において、対応するエンティティがレイアウト互換な型であり、両エンティティともにno_unique_address属性の指定有無が同一であり、かつ両エンティティが同一幅ビットフィールドもしくは(ビットフィールドではなく)非静的メンバ変数という条件を満たす、先頭からの最長の並びを指す。

#include <type_traits>

enum class E0 : int { A, B, C };
enum class E1 : int { X, Y, Z };
enum class E2 : char { A, B, C };

struct X { int a; };
struct Y { const int b; };
struct Z { char c; };
struct X1 { static int s; int m; };

int main()
{
  static_assert(    std::is_layout_compatible_v<int, int>);
  static_assert(not std::is_layout_compatible_v<char, unsigned char>);

  static_assert(    std::is_layout_compatible_v<E0, E1>);
  static_assert(not std::is_layout_compatible_v<E0, E2>);
  static_assert(not std::is_layout_compatible_v<E0, int>);

  static_assert(    std::is_layout_compatible_v<X, Y>);
  static_assert(not std::is_layout_compatible_v<X, Z>);
  static_assert(    std::is_layout_compatible_v<X, X1>);
}

出力

バージョン

言語

  • C++20

処理系

関連項目

参照