web-dev-qa-db-ja.com

NULLとnullptr(なぜ置き換えられたのですか?)

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

ポインターを扱うときに、どのシナリオでnullptrよりもNULLを使用すると効果的ですか。

164
Riptyde4

nullptrは常にポインタ型です。 0(別名、CのNULLをC++にブリッジする)は、とりわけ、オーバーロードされた関数の解決にあいまいさをもたらす可能性があります。

f(int);
f(foo *);
235
Joe Z

あなたはそれがなぜ置き換えられたのかについての良い説明を見つけることができます nullポインタの名前:nullptr 、論文を引用するために:

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

  • ライブラリ作成者が整数型やポインタ型のオーバーロードについて心配する必要がないように、ユーザーがあいまいさの少ないコードを作成する方法を提供することで、ライブラリ構築のサポートを改善します。

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

  • C++を教えやすく、習得しやすくする。

53
Shafik Yaghmour

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

C++では、NULLの定義は0なので、審美的な違いだけがあります。私はマクロを避けることを好むので、私は0を使う。NULLに伴うもう一つの問題は、人々がそれが0と違う、あるいは整数ではないと誤解することが時々あるということである。標準化前のコードでは、NULLは不適切なものとして定義されていたため、回避する必要がありました。最近はそれほど一般的ではありません。

Nullポインタに名前を付ける必要がある場合は、nullptrと呼びます。それがC++ 11で呼ばれていることです。そして、 "nullptr"がキーワードになります。

31
Deidrei

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

もう1つの理由:コードの読みやすさと明確さ。

12