型の分類表
C++ の型を分類しました。本編の解説に合わせて、C++14 をベースにして作成しており、それより前のバージョンでの事情を無視しています。リンクは、本編でその型を取り上げているページへ移動します。
分類が非常に複雑であり、1つの整った表形式では表現しきれないないため、同じ型が複数回登場することがあります。
C言語の型の分類表がこちらのページにあります。
まず、基本型と複合型に分類できます。
- 基本型 (fundamental types)
- 算術型 (arithmetic types)
- 整数型 (integer types、integral types)
- bool型
- 文字型 (character types)
- 狭い文字型 (narrow character types)
- wchar_t型
- char16_t型
- char32_t型
- 符号付き整数型 (signed integer types)
- 符号なし整数型 (unsigned integer types)
- 標準符号なし整数型 (standard unsigned integer type)
- 拡張符号なし整数型 (extended unsigned integer type)
- 処理系定義(拡張符号付き整数型に対応するように定義される)
- 標準整数型 (standard integer types)
- 拡張整数型 (extended integer types)
- 浮動小数点型 (floating point types)
- 不完全型 (incomplete types)
- void型
- 不完全オブジェクト型 (incompletely-defined object types)
- 複合型 (compound types)
- 以下のすべて。また、これらを再帰的に繰り返すことを含む
- 配列型 (array types)
- 関数型 (function types)
- ポインタ型 (pointer types)
- オブジェクトポインタ型 (object pointer type)
- オブジェクト型を指し示すポインタ
- voidポインタ
- 関数ポインタ (function pointer type)
- 参照型 (reference types)
- 左辺値参照 (lvalue reference)
- 右辺値参照 (rvalue reference)
- クラス型 (class types)
- 列挙型 (enumeration types)
- 非静的データメンバへのポインタ
上記の分類のほかに、型のもつ特徴によって以下のように分類されます。
- オブジェクト型 (object types)
- 以下の “いずれでもない” 型。CV修飾の有無は問わない
- スカラ型 (scalar types)
- POD型 (POD types)
- 以下のすべて、およびこれらの配列型と CV修飾された型
- スカラ型
- PODクラス (POD class)
- POD構造体 (POD struct)
- 以下のすべてを満たす共用体でないクラス型2
- トリビアルクラス型である
- 標準レイアウトクラスである
- POD構造体や POD共用体でない(また、それらの配列でない)、非静的データメンバを持たない
- POD共用体 (POD union)
- 以下のすべてを満たす共用体2
- トリビアルクラス型である
- 標準レイアウトクラスである
- POD構造体や POD共用体でない(また、それらの配列でない)、非静的データメンバを持たない
- トリビアル型 (trivial types)
- 以下のすべて、およびこれらの配列型と CV修飾された型
- スカラ型
- トリビアルクラス型 (trivial class)
- トリビアルにコピー可能な型 (trivially copyable types)
- CV修飾されていないスカラ型
- トリビアルにコピー可能なクラス型(trivially copyable class)
- 以下をすべて満たすクラス1
- トリビアルでないコピーコンストラクタをもたない
- トリビアルでないムーブコンストラクタをもたない
- トリビアルでないコピー代入演算子をもたない
- トリビアルでないムーブ代入演算子をもたない
- トリビアルなデストラクタをもつ
- 上記2つの配列型
- 上記すべての volatile でなく const修飾されている型
- 標準レイアウト型 (standard-layout types)
- 以下のすべて、およびこれらの配列型と CV修飾された型
- スカラ型
- 標準レイアウトクラス型(standard-layout class)
- 以下をすべて満たすクラス3
- 標準レイアウトクラス(また、その参照や配列)でない非静的データメンバをもたない
- 仮想関数をもたない
- 仮想基底クラスをもたない
- すべての非静的データメンバのアクセス指定が同じ
- 標準レイアウトクラスでない基底クラスをもたない
- 「もっとも派生したクラスが非静的データメンバをもたず、非静的データメンバをもつ基底クラスが最大でも1つである」または「非静的データメンバをもつ基底クラスをもたない」
- 最初の非静的データメンバと同じ型の基底クラスをもたない
- 標準レイアウト構造体 (standard-layout struct)
- 標準レイアウトクラス型のうち、structキーワードを使って定義されたもの
- 標準レイアウト共用体 (standard-layout union)
- 標準レイアウトクラス型のうち、unionキーワードを使って定義されたもの
- リテラル型 (literal types)4
- void型
- スカラ型
- 参照型
- 要素がリテラル型の配列型
- 以下の条件をすべて満たすクラス型
- トリビアルなデストラクタをもつ
- 集成体である。または、コピーコンストラクタ・ムーブコンストラクタのいずれでもない、constexpr なコンストラクタ・コンストラクタテンプレートを最低でも1つもつ
- すべての非静的データメンバと、基底クラスが、非volatile なリテラル型である
- 集成体(アグリゲート)(aggregate)
- 配列型
- 以下を条件をすべて満たすクラス型
- ユーザー定義コンストラクタをもたない
- private または protected の非静的データメンバをもたない
- 基底クラスをもたない
- 仮想関数をもたない
また、型の分類に関係する用語として以下のものがあります。
- レイアウト互換型 (layout-compatible types)5
- 2つの型 T1 と T2 が同じ型であるとき、この2つの型をこう呼ぶ
- 呼び出し可能型 (callable type)