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++: ??