他の答えは正しいです。しかし、なぜ nullptr
が優れているのかについてもう少し言いたかったのです。
C++11 では、「完全な転送」が非常に重要です。どこでも使用されています。明らかな場所はbind
とfunction
です。しかし、それはカバーの下の他の多くの場所でも使用されています. しかし、「完全な転送」は完全ではありません。失敗する場所の 1 つは、NULL ポインター定数です。
template <class T>
void display(T)
{
std::cout << type_name<T>() << '\n';
}
template <class T>
void
f(T&& t)
{
display(std::forward<T>(t)); // "perfectly forward" T
}
int main()
{
f(0);
f(NULL);
f(nullptr);
}
の適切な定義によりtype_name<T>()
、私のシステムでは次のように出力されます。
int
long
std::nullptr_t
これにより、動作中のコードとエラーを簡単に区別できます。運が良ければ、コンパイル時にエラーが発生します (恐ろしいエラー メッセージが表示されます)。ただし、状況によっては実行時エラーが発生することもあります。
コードでの 0 と NULL の使用を積極的に禁止します。
コードで完全な転送を行っていない場合でも、呼び出すコード (std::lib など) が内部でそれを使用している可能性が非常に高くなります。