記事のタイトルの括弧内に「ヌルポ」と書きたくなってしまったことはさておいて、今回は"Null pointer constant"(ヌルポインタ定数)について。
訳をするときに少々悩みの種になったんですが、記事のタイトルには"constant"の訳を入れない訳を書きました。もうひとつ、「ナル」か「ヌル」かという問題。発音的には「ナル」なんですが、カタカナ表記だとどうしても「ヌル」の方が見慣れてたのでこちらにしました。
実際は名前より中身の方が重要ですから、中身を早く書きましょう。
C++でのヌル(NULL)の扱いは少々ひどくて、基本的にはC言語では((void*) 0)か、0と定義されています。すでにこの時点であいまいな定義ですが、ややこしいのは一方の定義が0は0でもvoid*型の意味での0だということです。
C++ではvoid*型は他のポインタへの暗黙的な変換が認められていないため、NULLの定義が0とされています。しかし((void*)0)であった場合
char* c = NULL;
のようなことはコンパイルエラーとなりできません。
さらにオーバーロード時には次のような問題も引き起こします。
foo(int x); foo(char* c);
この状況でfoo(NULL)という呼び出しを行った場合、どちらのオーバーロードが呼ばれるかといえば、どう眺めても定義からすればfoo(int x)です。しかし、普通に考えてint型にNULLを渡したい人はそういないでしょう。
これではNULLの挙動は少々怪しいどころか、かなり怪しいものとなっています。これらは意図しない実行結果を招くことになります。
そこでNULLに代わる新しいヌル、nullptrが導入される予定です。
整数型との比較や代入はできなくなりますが、代わりに全てのポインタ型との比較や代入ができるようになります。
基本的にヌルってポインタ型との比較・代入がしたくて使いますよね。
その期待に沿った形のヌルとなるわけです。