The following examples are taken from one of Stephen's papers (N/A http://www.semantics.org/publications/01_10_steppingback.pdf). Stephen kindly referred me to it when I just couldn't see why the pointer to pointer assignments in his book wouldn't compile. Harmless at first sight but devastating in its effect. (Probably an instance of blowing off ones leg – see Bjarne Stroustrup, N/A http://www.research.att.com/~bs/bs_faq.html#really-say-that.)
char* a[MAX]; // aka char** const char** ppcc = a; // compile error! why see belowrationale for the compile error:
const T ct; T* pt; const T** ppct = &pt; // compile error *ppct = &ct; *pt = t_other; // trash ct
// D1 publicly inherits from B D1 d1; D1** ppd1 = &d1; B** ppb = ppd1; // compile error! why see belowrationale for the compile error:
// D1 and D2 inherit publicly from B D1 d1; D1* pd1 = &d1; B** ppb1 = &pd1; // compile error D2* pd2; B** ppb2 = &pb2; // compile error *ppb2 = *ppb1; // pd2 now points to an D1-objectIn Stephen's paper you will find not so obvious disguises of the above problems. If the compiler complains, don't even think about casting away the problem, it is right, as always, and you are wrong.