最終更新日時: 2026年05月11日 13時00分09秒 (JST)
Akira Takahashi が更新

履歴 編集

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

### 処理系

- Clang: ??
- GCC: 16 (`-freflection` オプション指定) ✅
- Visual C++: ??

## 関連項目

- C++26 静的リフレクション
- `std::meta::is_structural_type`

## 参照

- P3856R8 New reflection metafunction - is_structural_type (US NB comment 49)