混ぜるな危険

GCCやVCはメンバへのポインタをメンバにもつPOD型を正しくゼロ初期化してくれない。

#include <cassert>

struct foo
{
  int mem1;
  int foo::* mem2;
};

int main()
{
  foo x = {0};
  assert(x.mem2 == foo().mem2);
  return 0;
}

対応策
POD型の構造体のメンバにはCにないデータ型を指定しない。



というか、Cに存在するデータ型でも0の内部表現が全ビット0でないなら、このバグが出そうな気がする。(そんな環境もってないから確認できねぇけど)