でc++03
、nullポインタを削除しても効果がないことは明らかです。確かに、それはその中で明確に述べられ§5.3.5/2
ています:
どちらの方法でも、deleteのオペランドの値がnullポインターの場合、操作は効果がありません。
ただし、この文の現在のドラフトではc++0x
欠落しているようです。ドラフトの残りの部分では、delete-expressionのオペランドがnullポインター定数でない場合に何が起こるかを示す文しか見つかりませんでした。ヌルポインタの削除はまだで定義されてc++0x
いますか?もしそうなら、どこで?
ノート:
それがまだ十分に定義されていることを示唆する重要な状況証拠があります。
まず、次のように§5.3.5/2
述べている2つの文があります
最初の選択肢(オブジェクトの削除)では、deleteのオペランドの値はnullポインター値である可能性があります...
そして
2番目の選択肢(配列の削除)では、deleteのオペランドの値はnullポインター値または...
これらは、オペランドがnullであることが許可されていることを示していますが、それ自体では、nullの場合に何が起こるかを実際には定義していません。
第二に、の意味を変更することdelete 0
は大きな重大な変更であり、標準化委員会がこの特定の変更を行う可能性はほとんどありません。さらに、これがc++0x
ドラフトの互換性アネックス(アネックスC)の重大な変更であるという言及はありません。ただし、附属書Cは有益なセクションであるため、これには規格の解釈は含まれていません。
一方、nullポインタを削除しても効果がないという事実は、追加の実行時チェックを意味します。多くのコードでは、オペランドがnullになることはないため、このランタイムチェックはオーバーヘッドゼロの原則と矛盾します。たぶん、委員会は、標準のc ++を言語の指定された設計目標にさらに一致させるために、動作を変更することを決定しました。