1

void *==nullptrの演算子deleteを呼び出すことで標準が何をする必要があるのか​​理解できません。

このようなもの:

void foo(void* ptr) // ptr == nullptr here
{
    delete ptr;
}

一方では、標準で次のステートメントがあります。

ISO / IEC 14882:2011

5.3.5削除[expr.delete]

1 ...オペランドには、オブジェクト型へのポインタ、またはオブジェクト型へのポインタへの単一の非明示的変換関数(12.3.2)を持つクラス型が必要です。結果のタイプはvoid.78です。

78)これは、voidがオブジェクト型ではないため、void*型のポインタを使用してオブジェクトを削除できないことを意味します

これにより、void*を削除したコードの形式が正しくなくなります。一方、deleteのnullptrに関する別のステートメントがあります。

ISO / IEC 14882:2011

5.3.5削除[expr.delete]

2 ...最初の選択肢(オブジェクトの削除)では、deleteのオペランドの値は、nullポインター値、前のnew-expressionによって作成された非配列オブジェクトへのポインター、またはサブオブジェクトへのポインター( 1.8)そのようなオブジェクトの基本クラスを表す(第10節)。そうでない場合、動作は未定義です。2番目の選択肢(配列の削除)では、deleteのオペランドの値は、nullポインター値、または前の配列new-expressionから得られたポインター値である可能性があります。79そうでない場合、動作は未定義です。

このような状況では、どのような実装を行う必要がありますか?

4

1 に答える 1

3

ヌルとvoid*は2つの異なるものです:

delete static_cast<int*>(nullptr); // deleting null pointer, of int*

与えられたコードは形式が正しくありませんが、ポインターの(nullの場合もあります)とは関係ありませんが、そのタイプ(の場合はありませんvoid*)とは関係ありません。

于 2013-02-22T04:10:17.960 に答える