未定義の動作とシーケンス ポイントの再検討
式 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 ());
式以外の考慮事項
元の式 i = i は、そもそも式であるかどうかという疑問を引き起こします。そうでない場合は、シーケンス ポイント ルールの対象外となる可能性があります。ただし、この引数は式として解析され実行されるため、成立する可能性は低いです。
複数の変更
対象となるもう 1 つの式、a[ i] = i 、シーケンス ポイント間で変更が行われる可能性があるため、疑問も生じます。ただし、 a が添え字演算子をオーバーロードするユーザー定義型である場合、これは明確に定義されています。
式の複雑さ
式 i は C で明確に定義されています。 03 は、関数間に明確に定義されたシーケンス ポイントがある ((i.operator ()).operator ()).operator () と同等であるためです。
結論
ユーザー定義型とシーケンス ポイントを含む式の動作は、演算子の特定の実装によって異なります。オーバーロードされた演算子は関数として動作し、シーケンス ポイントを提供します。ただし、式がシーケンス ポイント ルールの対象となるかどうかは、その構文構造と式としての解釈に依存する場合があります。
以上が演算子のオーバーロードにより、ユーザー定義型の「i = i」などの式での未定義の動作が排除されますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。