まず、C の時代から 0 はヌルポインタだ。
だというのに C で NULL を ((void*)0) と定義することが許されていたのは、
整数型へそのまま代入できてしまわないようにするためだ。
まあ警告止まりかもしれないが、ないよりゃマシだ。

何で C++ でその定義が許されなくなったかというと、
C では void ポインタから他のポインタへの暗黙のキャストが許されていたけど、
C++ ではそれを禁止するようになったからだ。
いちいち明示的なキャストが必要になるのでは困るので、
NULL は 0 と定義されるようになった。

そして、C でも C++ でも NULL が推奨されないなんて話は聞いたことがない。
ポインタを扱っているという目印になるわけで、プログラムを読みやすくする効果がある。
どんどん使えばいい。