18

新しい標準には、古い標準とは異なる未定義の動作があります。たとえば、新しいシーケンスルールは、以前は定義されていなかったいくつかの算術演算(シーケンスポイント間の複数の書き込みなどの理由)が定義されることを意味します。

では、未定義動作について新たに何を学ぶ必要があるのでしょうか。

4

2 に答える 2

14

私の意見では、新しいルールは説明と理解がより複雑です。たとえば、次のことを考慮してください。

int x = 12;
x = x++ + 1; // undefined behaviour
x = ++x + 1; // valid

同じ式の同じ変数に対する複数の副作用を回避することをお勧めします。これは、より理解しやすいルールです。AFAIK C++0X は、過去には未定義の動作であり、現在は合法的な使用であるいくつかのケースを変更しました (たとえば、上記の 2 つの式の 2 番目)。道徳的です;-) ...誰もあなたにそのようなものの使用を強制していません.

実際、上記のケースでは、言語の別の問題 (#222) を修正したことの副作用として、2 番目の式の有効性が意図せずに発生したようです。何かをUBから適切に定義されたものに変更しても害はないと考えられたため、式を有効にする決定が下されました。しかし、これはプログラムに何の損害も与えませんでしたが (もちろん UB は最悪の問題です)、実際には言語自体にいくらかの損害を与えたと思います...説明して理解するのがすでに複雑なルールを変更するさらにあいまいなもの。

IMO C++ は、C からの自然な進化を続けており、見栄えの良い、論理的なステートメントの束が素晴らしいことを実行できます...そして、同じように見栄えがよく、同じように素晴らしく、同じように論理的なステートメントの別の束があなたの代わりに爆発するコンピューター。

于 2010-12-07T17:42:20.747 に答える
3

C++0x では、以前は定義されていなかった多数のケースが、条件付きでサポートされるようになったケースに変更されています。セマンティクスは次のとおりです。

  • 実装が条件付きでサポートされている機能をサポートしていない場合は、それを文書化し、それに違反するプログラムの診断を発行する必要があります。
  • 実装それをサポートしている場合、標準が作成する追加の要件に従って動作する必要があります。たとえば、標準は、何かが実装定義のセマンティクスで条件付きでサポートされていると言うかもしれません。その場合、実装はその機能をどのようにサポートするかを文書化する必要があります。

以前は定義されていなかった一般的なケースは、省略関数パラメーターを介して自明でないコピー コンストラクター、自明でないムーブ コンストラクター、または自明でないデストラクタを持つクラス型の引数を渡す場合です。これは、実装定義のセマンティクスで条件付きでサポートされるようになりました。

于 2010-12-12T01:00:35.720 に答える