web-dev-qa-db-ja.com

「int * ptr = int()」値の初期化はどのように違法ではありませんか?

次のコード(取得 ここから ):

_int* ptr = int();
_

visual C++でコンパイルし、ポインタを値初期化します。

そんなことがあるものか?つまり、int()はタイプintのオブジェクトを生成し、intをポインタに割り当てることはできません。

上記のコードはどのように違法ではありませんか?

86
sharptooth

int()は値が0の定数式であるため、nullポインター定数を生成する有効な方法です。最終的には、int *ptr = NULL;の言い方が少し異なります。

110
Jerry Coffin

int()0を生成するため、これはNULLと交換可能です。 NULL自体は0として定義され、CのNULL(void *) 0です。

これはエラーになることに注意してください。

int* ptr = int(5);

そしてこれはまだ機能します:

int* ptr = int(0);

0は特別な定数値であるため、ポインター値として扱うことができます。 0などの1 - 1を生成する定数式は、nullポインター定数としても使用できます。

35

int()は、デフォルトで初期化された定数の整数、つまり値0に評価されます。この値は特別です。これは、NULL状態へのポインターを初期化するために使用されます。

18
Mark Ransom

N3290(C++ 03は同様のテキストを使用)から、4.10ポインター変換[conv.ptr]段落1(強調は私のものです):

1 nullポインタ定数は整数型の整数型のprvalue(5.19)ゼロと評価される整数型またはstd :: nullptr_t型のprvalueです。 nullポインター定数は、ポインター型に変換できます。 結果はその型のnullポインタ値ですそしてオブジェクトポインタまたは関数ポインタ型の他のすべての値と区別できます。このような変換は、ヌルポインタ変換と呼ばれます。 [...]

int()は、ゼロと評価される整数型の整数型の整数定数式prvalueであるため(一口です!)、ポインター型を初期化するために使用できます。ご覧のように、 0は、特殊な場合の唯一の整数式ではありません。

13
Luc Danton

まあintはオブジェクトではありません。

ここで起こっていることは、int()によって決定されるメモリアドレスを指すようにint *に指示していることだと思います。

したがって、it()が0を作成する場合、int *はメモリアドレス0を指します。

4
Megatron