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

#include <type_traits>

struct X { int a; };
struct Y { int b; };
struct Z { char c; };

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

int main()
{
  static_assert( std::is_layout_compatible_v<X, X>);
  static_assert( std::is_layout_compatible_v<X, Y>);
  static_assert(!std::is_layout_compatible_v<X, Z>);
  static_assert( std::is_layout_compatible_v<E0, E1>);
  static_assert(!std::is_layout_compatible_v<E0, E2>);
}

出力

バージョン

言語

  • C++20

処理系

関連項目

参照