Nach Angaben von cpp-Referenz , nullptr
ist ein Schlüsselwort, das:
bezeichnet die Zeigerliteral . Es handelt sich um einen pr-Wert vom Typ std::nullptr_t
. Es gibt implizite Konvertierungen von nullptr auf den Nullzeigerwert von beliebiger Zeigertyp y jeder Zeiger auf einen Mitgliedstyp . Ähnliche Konvertierungen gibt es für jede Nullzeigerkonstante, also auch für Werte des Typs std::nullptr_t
sowie das Makro NULL
.
Also nullptr
ist ein Wert eines bestimmten Typs std::nullptr_t
, nicht int
. Er konvertiert implizit in den Null-Zeigerwert eines beliebigen Zeigertyps. Dieser Zauber geschieht unter der Haube für Sie und Sie müssen sich nicht um die Implementierung kümmern. NULL
ist jedoch ein Makro und eine implementierungsdefinierte Nullzeigerkonstante. Sie wird oft wie folgt definiert:
#define NULL 0
d.h. eine ganze Zahl.
Dies ist ein subtiler, aber wichtiger Unterschied, der Mehrdeutigkeiten vermeiden kann.
Zum Beispiel:
int i = NULL; //OK
int i = nullptr; //error
int* p = NULL; //OK
int* p = nullptr; //OK
und wenn Sie zwei Funktionsüberladungen wie diese haben:
void func(int x); //1)
void func(int* x); //2)
func(NULL)
fordert 1) weil NULL
ist eine ganze Zahl. func(nullptr)
fordert 2) weil nullptr
konvertiert implizit in einen Zeiger des Typs int*
.
Auch wenn Sie eine Aussage wie diese sehen:
auto result = findRecord( /* arguments */ );
if (result == nullptr)
{
...
}
und Sie können nicht einfach herausfinden, was findRecord
zurückgibt, können Sie sicher sein, dass result
muss ein Zeigertyp sein; nullptr
macht dies besser lesbar.
In einem abgeleiteten Kontext funktionieren die Dinge ein wenig anders. Wenn Sie eine Vorlagenfunktion wie diese haben:
template<typename T>
void func(T *ptr)
{
...
}
und Sie versuchen, es mit nullptr
:
func(nullptr);
erhalten Sie einen Compilerfehler, weil nullptr
ist vom Typ nullptr_t
. Sie müssen entweder explizit die Option nullptr
auf einen bestimmten Zeigertyp zu übertragen oder eine Überladung/Spezialisierung für func
con nullptr_t
.
Vorteile der Verwendung von nulptr:
- Vermeidung von Mehrdeutigkeiten zwischen Funktionsüberladungen
- ermöglicht Ihnen die Spezialisierung von Vorlagen
- sicherer, intuitiver und aussagekräftiger Code, z. B.
if (ptr == nullptr)
代わりに if (ptr == 0)