C++ - const int * と int * const の間の型変換
为情所困
为情所困 2017-05-16 13:31:16
0
1
728

const int *: ポインタ自体は可変ですが、指す値は不変です

int * const: ポインタ自体は不変であり、指す値は変更可能です

const int * -> int * const を変換するとエラーが報告されます

int * const -> const int * の変換が可能です

意味的に言えば、これは理解しやすいですが、形式的な観点から見ると、どちらも不変の量を持っているのに、なぜ変換中に一方の方向は実現可能であり、もう一方の方向は実現できないのでしょうか?よく考えてみると、ポインタと値が同じレベルにないからかもしれませんが、それを明確にする方法がわかりません?

为情所困
为情所困

全員に返信 (1)
过去多啦不再A梦

ここで説明するのは暗黙的な変換 (static_cast と同様) であると仮定します。

基礎となる const は修飾変換に準拠しています。ターゲットの型はより修飾されている必要があります。つまり、const はそれ以上にすることはできますが、それ以下にすることはできません。

4.1 標準変換は、組み込みの意味を持つ暗黙的な変換であり、そのような変換の完全なセットが列挙されています。

4.4.1 「cv2 T」が「cv1 T」よりも cv 修飾されている場合、「cv1 T へのポインター」型の prvalue は、「cv2 T へのポインター」型の prvalue に変換できます。

トップレベルの const ルールはより複雑です。クラス型の場合、変換できるかどうかは変換コンストラクターと変換関数によって決まります。非クラス型の場合、トップレベルの const 変換はありません。条項 4 の標準変換では、トップレベルの const については何も述べていません。

ここでは、トップレベル const が関係するいくつかの状況について説明します。

表現:

5.8 [...] [注: 式が prvalue に変換されるときに、非クラス型の式の型から cv 修飾子が削除されるため、型 const int の左辺値式は、たとえば次のようになります。 int 型の prvalue 式が必要な場合に使用されます。
課題:

3.10.1 [...] 組み込みの代入演算子は、左オペランドが左辺値、右オペランドが prvalue であることを想定し、結果として左辺値を生成します。

3.10.2 prvalue が予期されるコンテキストに glvalue が現れると、その glvalue は prvalue に変換されます。
3.10.4 クラスの prvalue は cv 修飾された型を持つことができます; 非クラスの prvalue は常に cv 修飾されていない型を持ちます。

初期化:

8.5.16 [...] [ 注: "cv1 T" 型の式は、cv 修飾子 cv1 および cv2 とは独立して、"cv2 T" 型のオブジェクトを初期化できます。

つまり、必要なものが prvalue である場合、const prvalue は存在しません。 glvalue に関しては、次の規則があります:

4.3 式 e は、何らかの発明された一時変数 t (8.5) に対して、宣言 T t=e が整形式である場合に限り、暗黙的に型 T に変換できます。変換は、宣言と初期化を実行し、変換の結果として一時変数を使用することと同じです。T が左辺値参照型であるか、関数型 (8.3.2) への右辺値参照 (xvalue) である場合、結果は左辺値になります。 T がオブジェクト型への rvalue 参照である場合、それ以外の場合は prvalue である場合、式 e は初期化で glvalue として使用される場合にのみ glvalue として使用されます。
この段落では、暗黙的な変換後の値のカテゴリーを規定します。暗黙的な変換の結果が prvalue の場合、const はありません。結果が glvalue の場合、変換のターゲットのタイプは左辺値参照または右辺値参照である必要があります。この場合、次の初期化が成立していれば変換できます:

T &t = e;
T &&t = e;

const T &t = e;

const T &&t = e;

8.5.3.4 型「cv1 T1」および「cv2 T2」がある場合、T1 が T2 と同じ型であるか、T1 が T2 の基本クラスである場合、「cv1 T1」は「cv2 T2」に参照関連します。 T1 が T2 に参照関連しており、cv1 が cv2 と同じ、または cv2 よりも高い cv-qualification である場合、「T1」は「cv2 T2」と参照互換性があります。

参照互換により、初期化できるかどうかが制限されます。ここでのルールは、資格変換のルールと似ています。さらに、これらの定数はすでに基礎となる定数です。

追記: 修飾変換には脚注があります: 「これらのルールにより、const-safety が変換によって確実に保持されます。」 const の安全性を確保できる限り、合意されたものであるか想像上のものであるかに関係なく、暗黙的な const 変換はすべて問題ありません。 const 変換によって const の安全性は保証されるが、他の条件に違反するために実装できない場合、これはおそらく言語の錠剤です。面白い

いいねを押す+0
    最新のダウンロード
    詳細>
    ウェブエフェクト
    公式サイト
    サイト素材
    フロントエンドテンプレート
    私たちについて 免責事項 Sitemap
    PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!