この質問は、私がthis earlier, intriguing question about C-style casts and type conversionsと答えるときにC++仕様で気づいたことに関係しています。C++仕様では、Cスタイルのキャストで使用するstatic_cast/const_castチェーンでタイプを選択する方法が示されていますか?
C++仕様では、§ 5.4のCスタイルのキャストについて説明しています。これは、1つが有効であることが判明するまで、キャスト表記は、この順序で、以下のキャストをしようとしますと言っている:const_cast
reinterpret_cast
reinterpret_cast
続い
const_cast
static_cast
static_cast
次にconst_cast
が続きます。
私はそれがconst_cast
続いstatic_cast
を使用することを意味するものの偉大な直感的なアイデアを持っているが(例えば、const_cast<Base*>(static_cast<const Base*>(expr))
を経てBase*
からconst Derived*
を変換する)、私は、任意の文言が表示されません具体的には、具体的には、static_cast
/const_cast
シリーズで使用されているタイプが推測されます。単純なポインタの場合はそれほど難しくはありませんが、リンクされた質問に見られるように、余分なconst
がある場所に導入され、別の場所で取り除かれると、キャストが成功する可能性があります。
コンパイラーがどのような型をキャスティングチェーンで使用するかを決定するための規則はありますか?もしそうなら、彼らはどこですか?そうでない場合は、これが言語上の欠陥か、試してみる可能性のあるすべてのキャストを一意に決定するための十分な暗黙のルールがありますか?