10

私は少し混乱しています。

いつ nullptr を使用する必要がありますか?

常に使用する必要があるサイトをいくつか読んだことがありますが、たとえば、非ポインターに nullptr を設定することはできません。

int myVar = nullptr; // Not a pointer ofcourse

常に NULL 非ポインターと nullptr をポインターに使用する必要がありますか?

助けてくれてありがとう!私はc ++ 11(およびc ++全体)に非常に慣れていません。

4

2 に答える 2

11

null ポインター値nullptrへのポインターを初期化するときに常に使用します。これは、ドラフト n3485によると、それが意図されていることです。

[lex.nullptr] 段落 1

ポインタ リテラルはキーワード nullptr です。これは std::nullptr_t 型の prvalue です。[ 注: std::nullptr_t は、ポインター型でもメンバー型へのポインターでもない特殊な型です。むしろ、この型の prvalue はヌル ポインター定数であり、ヌル ポインター値またはヌル メンバー ポインター値に変換できます。[...] — エンドノート]

の使用に移りましょうNULL

同案によれば、次のように定義される。

[diff.null] パラグラフ 1

マクロ NULL, [...] は、 この国際標準における実装定義の C++ ヌル ポインター定数です。

ヌルポインタ定数は次のとおりです。

[conv.ptr] パラグラフ 1

null ポインター定数は、整数型の定数式 [...] 0 に評価される整数型の prvalue または型 std::nullptr_t の prvalue です。

つまり、 がゼロに評価される整数の prvalue として定義されているか、タイプ の prvalue として定義されているかは、実装定義の動作です。標準ライブラリの指定された実装が前者を選択した場合、整数型に割り当てることができ、ゼロに設定されることが保証されますが、後者が選択された場合、コンパイラはエラーを発行してプログラムを異常と宣言することができます-形成された。NULLstd::nullptr_tNULL

言い換えれば、条件付きで有効ですが [ IB を読む] を使用して整数を初期化することNULLはおそらく悪い考えです。代わりに 0 を使用してください。

一方、上記によれば、ポインターをヌルポインター値NULL初期化することが保証されていますが、これはマクロであり、いくつかの注意事項があり、型チェックと変換規則が適用される特定の型の prvalue です。 . それが主に優先される理由です。nullptrNULLnullptrnullptr

于 2013-09-12T22:10:17.340 に答える
2

次の 2 つの関数オーバーロードを検討してください。

void foo(int)
void foo(int*)

0C++ では、 null 値として使用する傾向があります。他の人が使用しますNULL。(NULLは のための単なる凝ったマクロです0)

またはを呼び出すと、どちらを呼び出すfoo(0)foo(NULL)が曖昧になります。foo(nullptr)はこのあいまいさを解消し、常に を呼び出しますfoo(int*)

于 2013-09-12T22:10:54.547 に答える