初期化と左辺値から右辺値への変換
提供されたコード スニペットは、C でよく議論される問題を引き起こします。 int x = x; のように変数をそれ自体で初期化するには、左辺値から右辺値への変換が必要になります。右側の 'x' が初期化されていない値であり、初期化されていない値の左辺値から右辺値への変換は一般に禁止されていることを考慮すると、この変換が未定義の動作 (UB) につながるかどうかという疑問が生じます。
期待される左辺値から右辺値への変換の証拠
C 11 標準には明示的な仕様がありません言語構造によって期待される値カテゴリに関して、状況証拠は、右辺値がデフォルトの期待値となるように意図されていることを示唆しています。
アプリケーションからイニシャライザへの変換
組み込み演算子の動作と同様に、コピー初期化でもprvalue を初期化子として使用します。この仮定は、次のことによってさらに裏付けられます。
コード スニペットの影響
コピー初期化では prvalue が必要であるという仮定の下で、コード スニペット int x = x;それは確かにUBにつながります。これは、右側の 'x' が初期化されていない左辺値であり、その左辺値から右辺値への変換の結果が不定の値になるためです。
さらなる証拠
提案された欠陥レポートでは、不定値を持つオブジェクトの左辺値から右辺値への変換が UB の原因となることを明確にする必要性を強調しています。この提案された変更は、コピー初期化ではそのような変換を許可すべきではないという概念をさらにサポートします。
結論
入手可能な証拠に基づくと、int x = である可能性が最も高くなります。 ×;は、初期化されていない 'x' の左辺値から右辺値への変換が禁止されているため、 C の UB を構成します。ただし、この規格には期待値カテゴリに関する最終的な仕様が欠けており、継続的な議論の余地が残されていることに注意することが重要です。
以上がC での「int x = x;」の未定義の動作は左辺値から右辺値への変換によるものですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。