型の分類表 🔗
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リファレンス(左辺値参照) (lvalue reference)
- rvalueリファレンス(右辺値参照) (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)
- 以下を満たすトリビアルにコピー可能なクラス型[1]
- トリビアルにコピー可能な型 (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)