1

ユーザーTonyが 指摘しているように、C++標準の1.3.12項に[注]があります。

許容される未定義の動作は、予測できない結果を伴う状況を完全に無視することから、環境に特徴的な文書化された方法での翻訳またはプログラムの実行中の動作にまで及びます。

これは、UBの定義と矛盾しませんか...この国際規格は要件を課していませんか?つまり、同じ段落で「要件なし」と言ってから「許容UB」と言うのです。

このメモはどのように解釈されるべきですか?それは確かにUBを何らかの形で制限しますか?

4

3 に答える 3

7

ISO/IEC 指令のパート 3の§6.5.1 から:

規格のテキストに組み込まれている注記と例は、規格の理解または使用を支援することを目的とした追加情報を提供するためにのみ使用され、規格への準拠を主張できるようにするために準拠する必要がある規定を含んではなりません。標準。

したがって、これは完全に非規範的 (非拘束的) であり、可能な説明のみを目的としています。

于 2010-11-25T08:02:23.710 に答える
6

メモは規範的ではないため、UB を制限するものではありません。もちろん、そのような詳細に依存するプログラムは、本質的に他の環境に安全に移植できませんが、実装が文書化された拡張として UB を正式に引き起こすいくつかの構成を使用できることを明確にするだけです。

于 2010-11-25T08:01:48.653 に答える
2

このメモは、動作が定義されていないコードに遭遇した場合に実装が行う可能性があることを説明しています。「許容される」という言葉は制限を意図したものではなく、一般的な動作の例がいくつか示されています。

興味深いことに、ほとんどの場合、コンパイラは何かをコンパイルする必要があります! このコードの断片を考えてみましょう:

void f() { 1 / 0; }

これに遭遇したときの翻訳者の振る舞いは明確に定義されていませんが、好きなことだけを行うことはできません! 実際、それがコンパイラである場合でも、このコンパイル ユニットをコンパイルする必要があります。これは、この関数を含むプログラムの動作がまだ明確に定義されている可能性があるためです! コンパイラは、関数が呼び出されたかどうかを認識できません。実際、この問題は、関数が「main()」であり、制御が確実に 0 除算を通過する場所で発生しました。結果として、コンパイラはそのプログラムでさえも拒否することが許可されていません。その理由は、プログラムは依然として整形式であり、適合するコンパイラーは整形式のプログラムをすべて受け入れる必要があるためです (特に指定がない限り、整形式のプログラムをすべて拒否し、診断エラー メッセージを発行します)。

ゼロによる除算がいつ発生する必要があるかを検出する際に、どのようにスマートコンパイラーが必要になるかを正確に指定するのは難しいため、これを不正な形式にすることは容易ではありません。

非常に興味深いことに、「要件を課さない」という標準の主張は、実際には間違いに非常に近いものです。分離コンパイルをサポートするコンパイル システムの特徴は、動作が明確に定義されていないコードが実際に実行されたかどうかを検出できないことです。プログラムに未定義の動作があるかどうかを推測します。

于 2010-12-13T17:47:44.650 に答える