CやC++では、どんな型Tであっても、T**からconst T**への暗黙の変換はできません。
1 2 | void* p; const void** cpp = &p; // コンパイルエラー |
もちろん、これには正当な理由があります(以下、私の普段の書き方であるconst後置で書きます、T const**はconst T**と同じです)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #include <iostream> void println(const int& ci) { std::cout << ci << std::endl; } int main() { const int ci = 0; int* pi; // 仮に、下の行がconst_castなしでコンパイルできたとする int const** pcpi = const_cast<int const**>(&pi); *pcpi = &ci; *pi = 1; println(ci); } |
分かりましたでしょうか?*pi = 1を行っているときの*piはciを指しています。int const**であるpcpiを通すことで、pi = &ciが実現してしまいます。そのため、T**からT const** (const T**)の暗黙の変換は許されないというわけです。
ちなみに、T**からT* const*やT const* const*への暗黙の変換は可能です。
スポンサード リンク |