const int *: ポインタ自体は可変ですが、指す値は不変です
int * const: ポインタ自体は不変であり、指す値は変更可能です
const int * -> int * const を変換するとエラーが報告されます
int * const -> const int * の変換が可能です
意味的に言えば、これは理解しやすいですが、形式的な観点から見ると、どちらも不変の量を持っているのに、なぜ変換中に一方の方向は実現可能であり、もう一方の方向は実現できないのでしょうか?よく考えてみると、ポインタと値が同じレベルにないからかもしれませんが、それを明確にする方法がわかりません?
ここで説明するのは暗黙的な変換 (static_cast と同様) であると仮定します。
基礎となる const は修飾変換に準拠しています。ターゲットの型はより修飾されている必要があります。つまり、const はそれ以上にすることはできますが、それ以下にすることはできません。 ここでは、トップレベル const が関係するいくつかの状況について説明します。表現:
5.8 [...] [注: 式が prvalue に変換されるときに、非クラス型の式の型から cv 修飾子が削除されるため、型 const int の左辺値式は、たとえば次のようになります。 int 型の prvalue 式が必要な場合に使用されます。 3.10.1 [...] 組み込みの代入演算子は、左オペランドが左辺値、右オペランドが prvalue であることを想定し、結果として左辺値を生成します。 3.10.2 prvalue が予期されるコンテキストに glvalue が現れると、その glvalue は prvalue に変換されます。 4.3 式 e は、何らかの発明された一時変数 t (8.5) に対して、宣言 T t=e が整形式である場合に限り、暗黙的に型 T に変換できます。変換は、宣言と初期化を実行し、変換の結果として一時変数を使用することと同じです。T が左辺値参照型であるか、関数型 (8.3.2) への右辺値参照 (xvalue) である場合、結果は左辺値になります。 T がオブジェクト型への rvalue 参照である場合、それ以外の場合は prvalue である場合、式 e は初期化で glvalue として使用される場合にのみ glvalue として使用されます。 T &&t = e;const T &t = e;
const T &&t = e;