int** ⇒ const int**
http://ml.tietew.jp/cppll/cppll/article/5102
int ** を const int ** へ代入できないのはなぜか? という話。
int* pi; const int** ppci = π // ここでコンパイルエラー const int ci = 0; *ppci = &ci; *pi = 3; // ↑エラーが起こらなければ、 // const なはずの ci の値を書き換えできてしまう
うっかり似たようなコードを書いてコンパイラに怒られた経験が何度もあるので、自分的にはポインタのポインタはなんとなく苦手です。
d.y.d.
B ** を A** へ代入できないのも、同様の理由だから、という話。
class A { }; class B : public A { public: void method_of_b(); }; B* pb; A** ppa = &pb; // ここでコンパイルエラー A a(); *ppa = &a; (*pb).method_of_b(); // ↑エラーが起こらなければ、 // A のオブジェクト a に対して // B のメソッドを呼び出すことができてしまう
こちらの場合は、
B b; B *pb = &b; A *pa = pb; assert(reinterpret_cast<long>(pa) == reinterpret_cast<long>(pb));
最後の assert は A と B の定義の仕方によっては、成り立たないことがしばしばあるということからもわかります。