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に移行したくなってきた。