標準(§5.2.11)によれば、const_castはcv修飾子(constまたはvolatile)をキャストします。なぜconst_castはあなたがキャストするものを述べる必要がありますか?
ここに簡単な例があります。その後、あなたは参照ツーconstの作成
class Bar { ... };
void foo_ptr(Bar*);
void foo_ref(Bar&);
:
Bar b;
const Bar& cb = b;
をして、あなたは適切なはconst_castを使用することにより、いずれかの関数を呼び出すことができます。
まず、ポインタと参照を取る二つの関数を宣言しますfoo_ptr(const_cast<Bar*>(&cb));
foo_ref(const_cast<Bar&>(cb));
ここに私の質問があります:const_castは他のキャストのために設計されたものではありませんので、あなたがキャストするものは明白ではありませんか?私が何かをしようとすると、a)は、コンパイラは私を停止する必要があり
:
foo_ptr(const_cast<>(&cb));
foo_ref(const_cast<>(cb));
私は次の2つの理由を考えることができます。つまり、なぜ言語は、私は単純に言うことはできません。
foo_ptr(const_cast<int*>(&cb));
foo_ref(const_cast<int&>(cb));
と明示的に私は、不正な動作から私を保つことができ、それにキャストてるタイプを述べるために私を強制することによって:のような、狂いました。私は、コンパイラに私を修正させるだけの何かを間違って書いてもらうことを好む言語が好きならば、奇妙なので、この(仮説的な)説明は弱いと思う。
b)変数がconstおよびvolatileの両方である場合は、あいまいさが考えられます。その場合、コンパイラは、どちらか一方または両方をキャストしようとしているかどうかを知る方法がありません。
それはなぜですか、または別の理由がありますか?
もちろん、演算子は 'const_cast <>(&b)'(bは 'const'ではありません)と結果セットの同じセットを許可します。したがって、ボラティリティを扱っていなくても、Alexandros const_cast <>はconstをトグルするか、デフォルトを追加または削除するかを指定します(後者の場合、それは誤った名前になります)。あなたが言うように、テンプレートでは、あなたが始めたことを知らずにconst型または非const型を得ることが望ましいことがよくあります。 –
@トニー:bについての良い点は、constである必要はありません。より一般的には、const_castもconstを追加できることは分かっていましたが、私の暗黙の前提は誰もそれをしないということです(他の方法もあるので)。 –
そして、私たちはマルチレベルのポインタについても話していません:) –