次のコード(ここから取得):
int* ptr = int();
Visual C ++でコンパイルし、ポインタを値初期化します。
そんなことがあるものか?I平均int()利回り型のオブジェクトintと私は割り当てることができませんintポインタに。
上記のコードはどのように違法ではありませんか?
次のコード(ここから取得):
int* ptr = int();
Visual C ++でコンパイルし、ポインタを値初期化します。
そんなことがあるものか?I平均int()利回り型のオブジェクトintと私は割り当てることができませんintポインタに。
上記のコードはどのように違法ではありませんか?
int()値int(C ++ 03で指定されたものだと思います)を生成し、のデフォルト値はintです0。これは、int *ptr = 0;
NULLゼロ以外の値になる可能性があるとは言いませんでした。私はそれが任意のゼロ値の整数定数(を含むint())である可能性があると言いました。
回答:
int()は値0の定数式であるため、nullポインタ定数を生成する有効な方法です。結局のところ、それはほんの少し異なる言い方ですint *ptr = NULL;
nullptrですが、新しいコードの代わりに、0またはNULL新しいコードで使用できる、もあります。
0nullポインター定数または数値0を意味する可能性があるのに対し、明らかにnullポインター定数を意味するためnullptrです。さらに、Jaminが言ったように、「追加のコンパイル時チェック」もあります。入力する前に考えてみてください。
int()は0、と交換可能なを生成するためNULLです。NULLである0CNULLとは異なり、それ自体はとして定義され(void *) 0ます。
これはエラーになることに注意してください。
int* ptr = int(5);
そしてこれはまだ機能します:
int* ptr = int(0);
0は特別な定数値であるため、ポインタ値として扱うことができます。を生成する定数式0など1 - 1は、nullポインタ定数としても使用できます。
(void *)0。これは、「値0の整数定数式、またはvoid *型にキャストされたそのような式」で定義された実装です。
NULLとして定義されたCコンパイラを使用したことはありません(void*)0。それはいつも0(または多分0L)でした。(しかし、C90が(void*)0Cで合法化されるまでに、私はすでにC ++を使用していました。)
#if !defined(__cplusplus) \n #define NULL ((void*)0) \n #else \n #define NULL (0)のものが含まれています。ubuntuのgccの現在のバージョンは4.5で、システムでは4.0です。
0は特別なリテラルです」-定数式であり、特別な値0を持っているという理由だけで、(1-1)同様に特別であり、nullポインタ定数でもありますint()。0リテラルであるという事実は十分ですが、定数式であるための必要条件ではありません。のようなものstrlen("")は、特別な値もあります0が、定数式ではないため、nullポインター定数ではありません。
0には、0リテラルではなく定数値についてです。
この式int()は、デフォルトで初期化された定数の整数、つまり値0に評価されます。この値は特別です。これは、NULL状態へのポインターを初期化するために使用されます。
int f() { return 0; }と、式f()は値0を生成しますが、ポインターの初期化には使用できません。
n3290(C ++ 03は同様のテキストを使用)から、4.10ポインター変換[conv.ptr]段落1(強調は私のものです):
1 nullポインター定数は、整数型の整数型のprvalue(5.19)であり、ゼロまたはstd :: nullptr_t型のprvalueと評価されます。nullポインター定数は、ポインター型に変換できます。結果はそのタイプのnullポインター値であり、オブジェクトポインターまたは関数ポインタータイプの他のすべての値と区別できます。このような変換は、ヌルポインタ変換と呼ばれます。[...]
int()は、ゼロと評価される整数型の整数型の整数型式prvalueであり(これは一口です!)、したがって、ポインター型を初期化するために使用できます。ご覧のとおり、0特殊な場合の積分式はこれだけではありません。
まあintはオブジェクトではありません。
ここで起こっていることは、int()によって決定されるメモリアドレスを指すようにint *に指示していることだと思います。
したがって、int()が0を作成する場合、int *はメモリアドレス0を指します。
int()最も確かにあるオブジェクトが。
int()ます。もちろん、への参照をバインドできます。定義するとint i;、質問iはありませんが、オブジェクトです。
intは、がタイプであり、オブジェクトではないためにのみ当てはまります。int()オブジェクトを生成するか、単に右辺値を生成するかは、他の人が言ったことには影響しません。