適合セマンティクスには混乱があるため、これらはC++のルールです。Cは完全に異なる適合モデルを使用しています。
未定義動作はオキシモロニックな用語です。つまり、プログラムではなく翻訳者が好きなように動作する可能性があります。これは一般的に、それが好きなことを何でもするコードを生成できることを意味します(しかしそれは控除です)。動作が未定義であると標準が述べている場合、このテキストを省略しても標準が翻訳者に課す要件は変更されないという意味で、テキストは実際にはユーザーにとって重要ではありません。
不正な形式のプログラムとは、特に指定がない限り、トランスレータの動作が厳密に定義されていることを意味します。プログラムを拒否し、診断メッセージを発行する必要があります。ここでの主な特殊なケースは、プログラムの形式が正しくないが診断が不要であることに違反した場合の単一定義規則です。
定義された実装は、動作を明示的に指定するドキュメントを含むという要件をトランスレータに課します。この特殊なケースでは、未定義動作が結果になる可能性がありますが、明示的に指定する必要があります。
不特定とは、振る舞いがセットから来ることを意味する愚かな用語です。この意味で、明確に定義されているのは、許可された動作のセットに1つの要素のみが含まれている特殊なケースです。Undefinedはドキュメントを必要としないため、ある意味では、ドキュメントなしで定義された実装と同じ意味です。
一般に、C ++標準は言語標準ではなく、言語標準のモデルです。実際の標準を生成するには、さまざまなパラメータをプラグインする必要があります。これらの中で最も認識しやすいのは、実装で定義された制限です。
標準にはいくつかのばかげた矛盾があります。たとえば、正当な翻訳者は、関数を提供する必要があるという理由で、明らかに優れたC ++プログラムをすべて拒否できますmain()
が、翻訳者は1文字の識別子しかサポートしません。この問題は、QOIまたは実装品質の概念によって解決されます。それは基本的に、誰が気にするか、それが適合しているという理由だけで誰もそのコンパイラを購入するつもりはないと言っています。
技術的には、ポインタが無関係のオブジェクトを指す場合の不特定の性質はoperator <
、おそらく次のことを意味することを意図しています。真または偽のいずれかの結果が得られますが、プログラムはクラッシュしませんが、これは不特定の正しい意味ではないため、は欠陥です。不特定の場合、許可された動作のセットを文書化するために標準の作成者に負担がかかります。これは、セットが開いている場合、未定義の動作と同等であるためです。
私は実際にstd::less
、一部のデータ構造ではキーを完全に順序付ける必要があるという問題の解決策として提案しましたが、ポインターは完全に順序付けられていませんoperator <
。線形アドレス指定を使用するほとんどのマシンless
では、と同じです<
がless
、たとえばx86プロセッサでの操作は潜在的に高価です。