ホームページ >バックエンド開発 >C++ >C で演算子をオーバーロードすると、「i = i」のような式での未定義の動作が排除されますか?

C で演算子をオーバーロードすると、「i = i」のような式での未定義の動作が排除されますか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-04 00:22:09712ブラウズ

Does Overloading Operators in C   Eliminate Undefined Behavior in Expressions like `i  =   i`?

未定義の動作とシーケンス ポイントの再検討

トピック「未定義の動作とシーケンス ポイント」の続編では、次の動作を詳しく掘り下げます。ユーザー定義を含む式type.

ユーザー定義型と未定義の動作

ユーザー定義型のインデックスを含む次の式を考えてみましょう。

i += ++i;

動作組み込み型を使用したこの式は未定義です。ただし、i が Index 型の場合でも、未定義の動作が呼び出されますか?

いいえ、呼び出されません。これは、式が次と等価になるためです。

i.operator+=(i.operator++());

オーバーロードされた演算子は関数であるため、通常の順序付け規則が適用されます。シーケンス ポイントは i.operator () の評価後に存在するため、その後の i.operator =() 内の i の変更は未定義の動作ルールに違反しません。

同様に、式 i.add(i .inc());そして私は明確に定義されています。最初の式は次と同等です:

i.operator+=(i.operator++());

2 番目の式は次と同等です:

(i.operator++()).operator++()).operator++();

これらの式のそれぞれには、operator () 式の評価後にシーケンス ポイントがあります。オブジェクト i が連続するシーケンス ポイント間で 2 回変更されないようにします。

添字演算子オーバーロード

式:

a[++i] = i;

ここで、 a は添字演算子をオーバーロードするユーザー定義型でもあり、明確に定義されています。インクリメント演算子は Index オブジェクトを返し、このオブジェクトは配列のインデックス付けに使用されます。代入演算子 = は、関数呼び出しであるoperator[]() メソッドと同等です。したがって、順序付け規則が適用され、i の評価後に順序点が存在します。したがって、式は明確に定義されています。

追加ポイント

  • 式に関連付けられたシーケンス ポイントの数は、関係するオペランドのタイプによって異なります。 i = i の場合が示すように。
  • C 03 では、式 i は次のようになります。明確に定義されています。

以上がC で演算子をオーバーロードすると、「i = i」のような式での未定義の動作が排除されますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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