276

0xC++ で、またはポインターベースのアプリケーションでNULL置き換えられたことを知っています。nullptr彼らがこの交換を行った正確な理由に興味がありますか?

ポインターを処理するときに、どのようなシナリオで有益に使用nullptrされていますか?NULL

4

4 に答える 4

380

nullptrタイプがありstd::nullptr_tます。任意のポインター型に暗黙的に変換できます。したがって、std::nullptr_tオーバーロードの解決でまたはポインター型に一致しますが、 などの他の型には一致しませんint

0(別名、C の NULL が C++ にブリッジされている) は、オーバーロードされた関数の解決にあいまいさを引き起こす可能性があります。

f(int);
f(foo *);

(コメントでこれを指摘してくれたCalethに感謝します。)

于 2013-12-11T03:09:43.913 に答える
82

A name for the null pointer: nullptr を読んで、論文を引用することで、なぜそれが置き換えられたのかについての良い説明を見つけることができます。

この問題は、次のカテゴリに分類されます。

  • ユーザーがあいまいさの少ないコードを記述できるようにすることで、ライブラリ構築のサポートを改善します。これにより、ライブラリの作成者は、時間の経過とともに整数型とポインター型のオーバーロードについて心配する必要がなくなります。

  • 整数 0 と nullptr の両方を明確に表現しやすくすることで、ジェネリック プログラミングのサポートを改善します。

  • C++ の教育と学習を容易にします。

于 2013-12-11T03:09:28.620 に答える
58

これは、Bjarne Stroustrup の言葉遣いです。

C++ では NULL の定義は 0 であるため、審美的な違いしかありません。私はマクロを避けたいので、0 を使用します。NULL に関するもう 1 つの問題は、人々が 0 とは異なる、および/または整数ではないと誤解することがあることです。標準化前のコードでは、NULL は不適切なものに定義されていた/定義されている場合があったため、回避する必要がありました/回避する必要がありました。最近ではあまり一般的ではありません。

null ポインターに名前を付ける必要がある場合は、nullptr と呼びます。それが C++11 で呼ばれるものです。すると、「nullptr」がキーワードになります。

于 2013-12-11T03:08:48.787 に答える
17

1 つの理由: リテラル0は型を取得する悪い傾向がありintます。たとえば、完全な引数転送で、またはより一般的にはテンプレート化された型の引数としてです。

もう 1 つの理由は、コードの読みやすさと明快さです。

于 2013-12-11T03:06:47.590 に答える