NULL vs nullptr (¿Por qué fue reemplazado?)

Sé que en C ++ 0x o NULL fue reemplazado por nullptr en aplicaciones basadas en punteros. Solo tengo curiosidad por la razón exacta por la que hicieron este reemplazo.

¿En qué situación se usa nullptr sobre NULL beneficioso cuando se trata de punteros?

nullptr es siempre un tipo de puntero. 0 (también conocido como NULL de C puenteado en C ++) podría causar ambigüedad en la resolución de la función sobrecargada, entre otras cosas:

 f(int); f(foo *); 

Puede encontrar una buena explicación de por qué fue reemplazado por la lectura de un nombre para el puntero nulo: nullptr , para citar el artículo:

Este problema se clasifica en las siguientes categorías:

  • Mejore el soporte para la construcción de bibliotecas, proporcionando una forma para que los usuarios escriban códigos menos ambiguos, de modo que con el tiempo los escritores de bibliotecas no tengan que preocuparse por la sobrecarga en tipos integrales y de punteros.

  • Mejore el soporte para la progtwigción genérica, haciendo que sea más fácil express ambo 0 y nullptr sin ambigüedades.

  • Haga que C + + sea más fácil de enseñar y aprender.

Aquí está la redacción de Bjarne Stroustrup,

En C ++, la definición de NULL es 0, por lo que solo hay una diferencia estética. Prefiero evitar las macros, así que uso 0. Otro problema con NULL es que las personas a veces creen erróneamente que es diferente de 0 y / o no es un número entero. En el código preestablecido, NULL se definía / a veces se define como algo inadecuado y, por lo tanto, tenía / debe evitarse. Eso es menos común en estos días.

Si tiene que nombrar el puntero nulo, llámelo nullptr; así se llama en C ++ 11. Entonces, “nullptr” será una palabra clave.

Una razón: el literal 0 tiene una mala tendencia a adquirir el tipo int , por ejemplo, en reenvío de argumento perfecto o más en general como argumento con tipo de plantilla.

Otra razón: legibilidad y claridad del código.