最終更新日時: 2024年06月11日 22時45分38秒 (JST)
Akira Takahashi が更新

履歴 編集

class template
<type_traits>

# std::is_aggregate(C++17)

    namespace std {
      template <class T>
      struct is_aggregate;

      template <class T>
      inline constexpr bool is_aggregate_v = is_aggregate<T>::value;
    }

## 概要

型`T`が集成体かを調べる。

集成体は、ユーザー定義のコンストラクタを持つことなく、初期化子リストによる初期化 (集成体初期化, aggregate initialization) ができる型である。

    struct Point {
      int x, y; // ユーザー定義のコンストラクタを持たない
    };

    Point x {3, 1}; // 初期化子リストによる初期化

    Point ar[] = { // 配列の初期化子リストで、要素ごとの初期化子を初期化子リストで記述
      {1, 2},
      {3, 4},
      {5, 6}
    };

型`T`が集成体であるための条件は以下である：

- ユーザー定義されたコンストラクタ、`explicit`なコンストラクタ、継承コンストラクタを持たない
- `private`／`protected`な非静的メンバ変数を持たない
- 仮想関数を持たない
- 仮想基底クラス、`private`／`protected`基底クラスを持たない

## 要件

`remove_all_extents_t<T>`した結果の型が、完全型であるか、`const/volatile`修飾された (あるいはされていない) `void`でなければならない。

## 効果

`is_aggregate`は、型`T`が集成体であれば`true_type`から派生し、そうでなければ`false_type`から派生する。

## 例

    #include <type_traits>
    #include <array>

    struct Point {
      int x, y;
    };

    int main()
    {
      static_assert(std::is_aggregate<Point>{});
      static_assert(std::is_aggregate<int[3]>{});
      static_assert(std::is_aggregate<Point[3]>{});
      static_assert(std::is_aggregate<std::array<Point, 3>>{});
    }

### 出力

## バージョン

### 言語

- C++17

### 処理系

- Clang: 5.0 ✅
- GCC: 7.2 ✅
- Visual C++: ??

## 参照

- LWG Issue 2911. An `is_aggregate` type trait is needed