C++の配列引数の問題

C++0xの勉強をしていたはずが, C++の勉強になってしまっているorz

昨日C++0xではVLAがサポートされないと書いたが,これはもともとC++には配列引数にまつわる問題があるので, このあたりをいじりたくないという事情があるのではないかと思う。
前になんかの本で読んだけどすっかり忘れていた。

つまり, 派生クラスのポインタから基底クラスへのポインタへのアップキャストが暗黙に行われてしまうということが問題で

class A {
  ...
};

class B : public A {
  ...
};

void f(A x[100]){
  ...
}

int main(..) {
  B array[100];
  f(array);
}

みたいな事をすると, B*->A*と暗黙に変換されてしまうので要素のアドレス計算がくるってしまうという事が起こる。ということでこれはしょうがない。

これは残念だ。