ホームページ > バックエンド開発 > C++ > C での「int x = x;」の未定義の動作は左辺値から右辺値への変換によるものですか?

C での「int x = x;」の未定義の動作は左辺値から右辺値への変換によるものですか?

Barbara Streisand
リリース: 2024-12-28 21:31:17
オリジナル
197 人が閲覧しました

Is `int x = x;` Undefined Behavior in C   Due to Lvalue-to-Rvalue Conversion?

初期化と左辺値から右辺値への変換

提供されたコード スニペットは、C でよく議論される問題を引き起こします。 int x = x; のように変数をそれ自体で初期化するには、左辺値から右辺値への変換が必要になります。右側の 'x' が初期化されていない値であり、初期化されていない値の左辺値から右辺値への変換は一般に禁止されていることを考慮すると、この変換が未定義の動作 (UB) につながるかどうかという疑問が生じます。

期待される左辺値から右辺値への変換の証拠

C 11 標準には明示的な仕様がありません言語構造によって期待される値カテゴリに関して、状況証拠は、右辺値がデフォルトの期待値となるように意図されていることを示唆しています。

  • 組み込み演算子は一貫して prvalue オペランドを必要とし、必要に応じて左辺値から右辺値への変換について明示的に言及します。 .
  • 参照の初期化は、オブジェクトに対して左辺値から右辺値への変換が予期されることを意味します。

アプリケーションからイニシャライザへの変換

組み込み演算子の動作と同様に、コピー初期化でもprvalue を初期化子として使用します。この仮定は、次のことによってさらに裏付けられます。

  • 標準では、標準変換を使用して初期化子の式を宛先の型に変換することが強調されています。
  • 左辺値から右辺値への変換を実行すると、正しい変換が可能になります。
  • ユーザー定義の変換がないことは、値カテゴリの変換が次の方法で処理されることを意図していることを示唆しています。

コード スニペットの影響

コピー初期化では prvalue が必要であるという仮定の下で、コード スニペット int x = x;それは確かにUBにつながります。これは、右側の 'x' が初期化されていない左辺値であり、その左辺値から右辺値への変換の結果が不定の値になるためです。

さらなる証拠

提案された欠陥レポートでは、不定値を持つオブジェクトの左辺値から右辺値への変換が UB の原因となることを明確にする必要性を強調しています。この提案された変更は、コピー初期化ではそのような変換を許可すべきではないという概念をさらにサポートします。

結論

入手可能な証拠に基づくと、int x = である可能性が最も高くなります。 ×;は、初期化されていない 'x' の左辺値から右辺値への変換が禁止されているため、 C の UB を構成します。ただし、この規格には期待値カテゴリに関する最終的な仕様が欠けており、継続的な議論の余地が残されていることに注意することが重要です。

以上がC での「int x = x;」の未定義の動作は左辺値から右辺値への変換によるものですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート