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

履歴 編集

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なコンストラクタ、継承コンストラクタを持たない
  • privateprotectedな非静的メンバ変数を持たない
  • 仮想関数を持たない
  • 仮想基底クラス、privateprotected基底クラスを持たない

要件

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

処理系

参照