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

履歴 編集

class template
<type_traits>

std::is_structural(C++26)

namespace std {
  template <class T>
  struct is_structural;

  template <class T>
  inline constexpr bool is_structural_v = is_structural<T>::value;
}

概要

T構造的型 (structural type) であるかを判定する。

構造的型は、定数テンプレートパラメータとして使用できる型である。具体的には以下のいずれかである:

  • スカラ型
  • 左辺値参照型
  • 直接基底クラスとメンバ変数がすべてpublicかつmutableでなく、それらの型がすべて構造的型(または構造的型の配列)であるリテラルクラス型
  • キャプチャを持たないラムダ式のクロージャ型

なお、右辺値参照型は構造的型ではない。

要件

remove_all_extents_t<T>完全型であるか、CV修飾されたvoidであること。

効果

is_structuralは、型T構造的型であればtrue_typeから派生し、そうでなければfalse_typeから派生する。

#include <type_traits>

struct Structural {
  int x;
  double y;
};

struct NotStructural {
private:
  int x;  // privateメンバがあるため構造的型ではない
};

int main() {
  static_assert(std::is_structural_v<int>);
  static_assert(std::is_structural_v<int&>);
  static_assert(std::is_structural_v<Structural>);
  static_assert(!std::is_structural_v<NotStructural>);
  static_assert(!std::is_structural_v<int&&>);  // 右辺値参照は構造的型ではない
}

出力

バージョン

言語

  • C++26

処理系

関連項目

参照