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 の定義の仕方によっては、成り立たないことがしばしばあるということからもわかります。