NULL vs nullptr (Perché è stato sostituito?)

So che in C ++ 0x o NULL stato sostituito da nullptr in applicazioni basate su puntatori. Sono solo curioso del motivo esatto per cui hanno realizzato questo ricambio?

In quale scenario si usa nullptr su NULL quando si tratta di puntatori?

nullptr è sempre un tipo di puntatore. 0 (noto anche come NULL di C su bridging in C ++) potrebbe causare ambiguità nella risoluzione della funzione sovraccaricata, tra le altre cose:

 f(int); f(foo *); 

Puoi trovare una buona spiegazione del perché è stato sostituito leggendo un nome per il puntatore nullo: nullptr , per citare il foglio:

Questo problema rientra nelle seguenti categorie:

  • Migliorare il supporto per la creazione di librerie, fornendo agli utenti la possibilità di scrivere codice meno ambiguo, in modo che nel tempo i writer di librerie non debbano preoccuparsi di sovraccaricare i tipi di puntatore e integrale.

  • Migliorare il supporto per la programmazione generica, rendendo più semplice esprimere sia integer 0 che nullptr in modo univoco.

  • Rendi il C ++ più facile da insegnare e imparare.

Ecco le diciture di Bjarne Stroustrup,

In C ++, la definizione di NULL è 0, quindi c’è solo una differenza estetica. Preferisco evitare i macro, quindi uso 0. Un altro problema con NULL è che le persone a volte credono erroneamente che sia diverso da 0 e / o non un intero. Nel codice pre-standard, NULL era / a volte definito come qualcosa di non adatto e quindi doveva / doveva essere evitato. Questo è meno comune in questi giorni.

Se devi nominare il puntatore nullo, chiamalo nullptr; questo è ciò che viene chiamato in C ++ 11. Quindi, “nullptr” sarà una parola chiave.

Una ragione: lo 0 letterale ha una brutta tendenza ad acquisire il tipo int , ad esempio nell’invio di argomenti perfetto o più in generale come argomento con tipo di modello.

Un altro motivo: leggibilità e chiarezza del codice.