19

C++11 の実装は として定義NULLされnullptrますか?

これは、新しい C++ 標準によって規定されますか?

4

4 に答える 4

18

馬の口から

C.3.2.4 マクロ NULL [diff.null]

1/<clocale><cstddef><cstdio><cstdlib><cstring><ctime>またはのいずれかで定義されているマクロ NULL は<cwchar>、この国際標準 (18.2) の実装定義の C++ null ポインター定数です。

独自の定義を提供するのは各実装次第です。gcc を思い出すと、__nullptr特別なチェックがある (たとえば、算術コンテキストで使用されていないことを確認する) ように正しく定義されています。

として定義することは可能nullptrです。コンパイラ/標準ライブラリのドキュメントをチェックして、何が行われたかを確認する必要があります。

于 2011-08-26T06:25:12.447 に答える
9

いいえ、NULL は以前と同じです。あまりにも多くの人が驚くべき方法で NULL マクロを使用しました。これを nullptr に再定義すると、多くのコードが壊れてしまいます。

詳しく説明すると、たとえば、多くの種類のハンドル typedef に NULL が使用されています。そのような typedef の背後にある実際の型がポインターでない場合、NULL を nullptr として定義すると問題が発生します。また、実際に NULL を使用して数値型を初期化している人もいるようです。

少なくとも、Microsoft が MSVC10 に nullptr を追加したときに発見したことであり、常に NULL を保持することにした理由です。他のコンパイラは別の道を選ぶかもしれませんが、私はそうは思わないでしょう。

于 2011-08-26T06:19:57.997 に答える
1

今後の標準 C++11 の FDIS では、整数式は引き続き null ポインター定数です。NULL マクロはまだ実装定義ですが、null ポインター定数でなければなりません。したがって、実際には、それは 0 として適切であるか、nullptr になる可能性があることを意味します。

0 または NULL を使用したコードは、以前と同じように機能します。

詳細はこちらをご覧ください。

于 2011-08-26T06:23:50.713 に答える