![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Опять же, наткнулся на некоторую особенность С++ ранее мне неизвестную. Опять же, пока не знаю, баг это или фича стандарта. Похоже, снова фича стандарта. (UPD: фича, да не та, код работает совсем не так, как от него я ожидал).
Оказывается, С++ куда более толерантен к преобразованию ссылочных типов, чем к преобразованию типов указателей. Речь, разумеется, о static casts, даже об implicit casts, т.е. о преобразованиях полностью санкционированных. Никакой грубой силы.
По идее, преобразования эти безопасны, непонятно почему C++ их не поддерживает напрямую, но позволяет сделать то же самое "в три приёма".
Оказывается, С++ куда более толерантен к преобразованию ссылочных типов, чем к преобразованию типов указателей. Речь, разумеется, о static casts, даже об implicit casts, т.е. о преобразованиях полностью санкционированных. Никакой грубой силы.
class A{}; class B : public A {}; void checker() { B **ppB; #if 0 A * const * ppA = ppB; // this fails! #endif B * &rpB = *ppB; A * const &rpA = rpB; A * const * ppA = &rpA; }
По идее, преобразования эти безопасны, непонятно почему C++ их не поддерживает напрямую, но позволяет сделать то же самое "в три приёма".