C++03のPOD
Fermilab | Homeによれば、C++03規格においてC互換型がPODである(と規格の脚注に書いてあると書いてある)。勉強のために、JIS X 3014:2003を拾い読みする。
集成体は初期化子節が使えるので初期化が簡単。
次のいずれももたない配列またはクラスを、集成体と呼ぶ。
JIS X 3014:2003 - 8.5.1. 集成体
- 利用者宣言のコンストラクタ
- 非公開または限定公開の非静的データメンバ
- 基底クラス
- 仮想関数
集成体の制限を厳しくした構造体と共用体がC互換クラスになる。ん、《クラスキー》classを使用するとC互換クラスじゃないのか? 他のところでうまいこと定義されるのかな?
構造体は、《クラスキー》structを付けて定義するクラスとする。そのメンバ及び基底クラスは、特に指定がない限り公開となる。共用体は、《クラスキー》unionを付けて定義するクラスとする。そのメンバは、特に指定がない限り公開となり、一度に一つのデータメンバだけを保持する。
C互換構造体は、次のいずれももたない集成体クラスとする。
- 非C互換構造体(又はその型の配列)である非静的データメンバ
- 非C互換共用体(又はその型の配列)である非静的データメンバ
- 参照型である非静的データメンバ
- 利用者定義のコピー代入演算子
- 利用者定義のデストラクタ
同様に、C互換共用体は、次のいずれももたない集成共用体とする。
- 非C互換構造体(又はその型の配列)である非静的データメンバ
- 非C互換共用体(又はその型の配列)である非静的データメンバ
- 参照型である非静的データメンバ
- 利用者定義のコピー代入演算子
- 利用者定義のデストラクタ
C互換クラスは、C互換共用体またはC互換共用体のいずれかとする。
JIS X 3014:2003 - 9. クラス
なんか定義の再帰がおかしい気がする。スカラ型はどうやって導かれるんだろう。C互換型の定義から?
算術型、列挙型、ポインタ型、及びメンバへのポインタ型、並びにそれらのcv修飾付きのものを、スカラ型と呼ぶ。スカラ型、C互換構造体型、C互換共用体型及びそれらの型の配列、並びにそれらのcv修飾付き版を、C互換型と呼ぶ。
JIS X 3014:2003 - 3.9. 型
うーむ、難しい。早いところC++0xに移行したくなってきた。