次のコード(ここから取得):
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
新しいコードで使用できる、もあります。
0
nullポインター定数または数値0を意味する可能性があるのに対し、明らかにnullポインター定数を意味するためnullptr
です。さらに、Jaminが言ったように、「追加のコンパイル時チェック」もあります。入力する前に考えてみてください。
int()
は0
、と交換可能なを生成するためNULL
です。NULL
である0
CNULL
とは異なり、それ自体はとして定義され(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*)0
Cで合法化されるまでに、私はすでに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()
オブジェクトを生成するか、単に右辺値を生成するかは、他の人が言ったことには影響しません。