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

演算子のオーバーロードにより、ユーザー定義型の「i = i」などの式での未定義の動作が排除されますか?

DDD
DDDオリジナル
2024-12-22 19:27:13899ブラウズ

Does Overloading Operators Eliminate Undefined Behavior in Expressions like `i  =   i` with User-Defined Types?

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

式 i = i は、i が組み込み型の場合に未定義の動作を呼び出すものとしてラベル付けされています。ただし、 i がユーザー定義型の場合の同様の式の動作について疑問が生じます。

ユーザー定義型の考慮事項

型インデックスは次のように定義されます。

class Index {
    int state;

    public:
        Index(int s) : state(s) {}
        Index& operator++() {
            state++;
            return *this;
        }
        Index& operator+=(const Index &index) {
            state += index.state;
            return *this;
        }
        operator int() {
            return state;
        }
        Index& add(const Index &index) {
            state += index.state;
            return *this;
        }
        Index& inc() {
            state++;
            return *this;
        }
};

i.operator =(i.operator ()); のような式はどうでしょうか。または i.add(i.inc());まだ未定義の動作を呼び出しますか?

シーケンス ポイントの影響

式 i.operator =(i.operator ());

  • オーバーロードされた演算子は関数であり、その評価の前後にシーケンス ポイントがあります。
  • 演算子 () および演算子 =() 呼び出しは、したがって、 -定義されたシーケンス ポイント。
  • したがって、式はシーケンス ポイントに違反することなく期待どおりに動作します。 rules.

式以外の考慮事項

元の式 i = i は、そもそも式であるかどうかという疑問を引き起こします。そうでない場合は、シーケンス ポイント ルールの対象外となる可能性があります。ただし、この引数は式として解析され実行されるため、成立する可能性は低いです。

複数の変更

対象となるもう 1 つの式、a[ i] = i 、シーケンス ポイント間で変更が行われる可能性があるため、疑問も生じます。ただし、 a が添え字演算子をオーバーロードするユーザー定義型である場合、これは明確に定義されています。

式の複雑さ

式 i は C で明確に定義されています。 03 は、関数間に明確に定義されたシーケンス ポイントがある ((i.operator ()).operator ()).operator () と同等であるためです。

結論

ユーザー定義型とシーケンス ポイントを含む式の動作は、演算子の特定の実装によって異なります。オーバーロードされた演算子は関数として動作し、シーケンス ポイントを提供します。ただし、式がシーケンス ポイント ルールの対象となるかどうかは、その構文構造と式としての解釈に依存する場合があります。

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

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