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*への暗黙の変換は可能です。

スポンサード リンク

この記事のカテゴリ

  • ⇒ T**からconst T**への暗黙の変換が許されないわけ
  • ⇒ T**からconst T**への暗黙の変換が許されないわけ