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

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

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-17 00:45:24494ブラウズ

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

int x = x;

における左辺値から右辺値への変換と未定義の動作 C では、初期化されていない値を代入するかどうかの問題それ自体が未定義の動作を構成することは議論のテーマです。標準 (3.3.2) では、例 int x = x; のように、変数をそれ自体で初期化すると、予期しない結果が生じる可能性があると宣言しています。

問題の核心は、lvalue- の潜在的な要件にあります。このような代入における右辺値への変換。右側の x が不定の値を持つ初期化されていない自動変数であるとします。標準 (4.1) によれば、このような値に対して左辺値から右辺値への変換を実行すると、未定義の動作が発生します。

左辺値から右辺値への変換の証拠

標準には明示的な要件がないにもかかわらず、さまざまな影響から、組み込み演算子がデフォルトで prvalue を期待することが主な目的であることが示唆されています。たとえば、標準では、組み込みの代入演算子には右オペランドの左辺値から右辺値への変換が必要であると記載されています。他の規定では、明示的に指定されている場合を除き、一般に左辺値から右辺値への変換が期待されることも示しています。

推測を初期化子に拡張する

初期化は代入とは異なりますが、値カテゴリに関する規格の曖昧さは、この領域にまで及ぶ可能性があります。証拠は、意図された仕様が、値が必要な場合は常に prvalue を期待することであることを示唆しています。

int x = x の結果;

予想が当てはまると仮定すると、x を次のように初期化します。それ自体は、初期化されていない値の左辺値から右辺値への変換を必要とするため、未定義になります。

裏付けとなる証拠

さらなる証拠は、初期化されていない変数に異なる型と異なる代入を割り当てるコードを検討することで得られます。参照の初期化では左辺値から右辺値への変換が禁止されているのに、オブジェクトの初期化ではそれが許可されているなど、一貫性のない動作により、コピー初期化では左辺値から右辺値への変換が期待されるという見方に信憑性が加わります。

さらに、欠陥レポートは、左辺値から右辺値への変換中の未定義の動作のコンテキストで、オブジェクトの値を「初期化されていない」から「不定の値」に再定義する明示的な言語を導入することを目的としています。これは、int x = x; のような場合に未定義の動作を確立する意図を示唆しています。

結論

提示された証拠に基づいて、初期化 int x = x; では左辺値から右辺値への変換が必要であると結論付けるのが妥当です。これにより、右側の x が初期化されていないため、未定義の動作が発生します。この規格の不一致と明確化の必要性は、値カテゴリの詳細な仕様の重要性を浮き彫りにしています。

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。