C++11で参入したnullptr型、いままでC++ではポインタの参照がないことを示すときにはNULLとしていました。しかし、NULLというのは#defineマクロで"0"と定義されています。C言語などでは(void*)0とされてきましたがC++では型チェックが厳しくなったためこのようになりました。では、なぜいまさらnullptrという型を作ったかというとNULLが0と定義されていることはほとんどのC++プログラマは知っています、そのためポインタにNULLではなく0を代入すると参照がない状態にできるという認識で溢れかえっています。しかしそれは当たり前のことで前回のメジャーアップデートからC++11に至るまで11年の月日が流れています。そのためどの本にも常識のように"C++ではポインタに0を代入するとヌルポインター"と書いてあって当然です。
しかし、この0を代入することによるヌルポインタの定義はプログラマが"0を代入しているだけ"という認識になりかねない他、数値の代入に見えたり、暗黙のキャストが行われる可能性があります。そのため今回のアップデートではnullptr型というヌルポインターという状態を表すだけの型が登場しました。例としてはこんなイメージです。
#include <iostream> using namespace std; //ポインタを受け取る関数 void func(int* p){ //処理 } void main(){ //数値を引数に渡しているように見える func(0); //引数がポインタだとわかる func(nullptr); }
これからはポインタを未参照にしたい場合にはnullptr型を採用しましょう!