C++11 の実装は として定義NULL
されnullptr
ますか?
これは、新しい C++ 標準によって規定されますか?
馬の口から
C.3.2.4 マクロ NULL [diff.null]
1/
<clocale>
、<cstddef>
、<cstdio>
、<cstdlib>
、<cstring>
、<ctime>
またはのいずれかで定義されているマクロ NULL は<cwchar>
、この国際標準 (18.2) の実装定義の C++ null ポインター定数です。
独自の定義を提供するのは各実装次第です。gcc を思い出すと、__nullptr
特別なチェックがある (たとえば、算術コンテキストで使用されていないことを確認する) ように正しく定義されています。
として定義することは可能nullptr
です。コンパイラ/標準ライブラリのドキュメントをチェックして、何が行われたかを確認する必要があります。
いいえ、NULL は以前と同じです。あまりにも多くの人が驚くべき方法で NULL マクロを使用しました。これを nullptr に再定義すると、多くのコードが壊れてしまいます。
詳しく説明すると、たとえば、多くの種類のハンドル typedef に NULL が使用されています。そのような typedef の背後にある実際の型がポインターでない場合、NULL を nullptr として定義すると問題が発生します。また、実際に NULL を使用して数値型を初期化している人もいるようです。
少なくとも、Microsoft が MSVC10 に nullptr を追加したときに発見したことであり、常に NULL を保持することにした理由です。他のコンパイラは別の道を選ぶかもしれませんが、私はそうは思わないでしょう。
今後の標準 C++11 の FDIS では、整数式は引き続き null ポインター定数です。NULL マクロはまだ実装定義ですが、null ポインター定数でなければなりません。したがって、実際には、それは 0 として適切であるか、nullptr になる可能性があることを意味します。
0 または NULL を使用したコードは、以前と同じように機能します。
詳細はこちらをご覧ください。