Warum nullptr in C++11? Was ist das? Warum ist NULL nicht ausreichend?
C++ Experte Alex Allain sagt es hier perfekt (meine Hervorhebung im Fettdruck):
...stellen Sie sich vor, Sie haben die folgenden zwei Funktionsdeklarationen:
void func(int n);
void func(char *s);
func( NULL ); // guess which function gets called?
Obwohl es so aussieht, als ob die zweite Funktion aufgerufen wird - schließlich übergeben Sie etwas, das ein Zeiger zu sein scheint -, ist es in Wirklichkeit die erste Funktion, die aufgerufen wird! Das Problem ist, dass die erste Version von func aufgerufen wird, weil NULL gleich 0 ist und 0 eine ganze Zahl ist. So etwas passiert zwar nicht immer, aber wenn es doch passiert, ist es extrem frustrierend und verwirrend. Wenn man die Details nicht kennt, könnte es durchaus wie ein Compilerfehler aussehen. Ein Sprachmerkmal, das wie ein Compilerfehler aussieht, ist, nun ja, nicht unbedingt erwünscht.
Nullptr eingeben. In C++11 ist nullptr ein neues Schlüsselwort, das zur Darstellung von NULL-Zeigern verwendet werden kann (und sollte!); mit anderen Worten, wo immer Sie vorher NULL geschrieben haben, sollten Sie stattdessen nullptr verwenden. Für Sie, den Programmierer, ist es nicht mehr klar (jeder weiß, was NULL bedeutet), aber für den Compiler ist es deutlicher die nicht mehr überall 0s sehen wird, die eine besondere Bedeutung haben, wenn sie als Zeiger verwendet werden.
Allain beendet seinen Artikel mit:
Unabhängig von all dem - die Faustregel für C++11 ist einfach, mit der nullptr
wenn Sie sonst NULL
in der Vergangenheit.
(Meine Worte):
Und schließlich sollten Sie nicht vergessen, dass nullptr
ist ein Objekt - eine Klasse. Es kann überall verwendet werden NULL
wurde zuvor verwendet, aber wenn Sie den Typ aus irgendeinem Grund benötigen, kann er mit decltype(nullptr)
, oder direkt beschrieben als std::nullptr_t
die einfach eine typedef
von decltype(nullptr)
wie hier gezeigt:
Definiert in der Kopfzeile <cstddef>
:
Siehe:
- https://en.cppreference.com/w/cpp/types/nullptr_t
-
et https://en.cppreference.com/w/cpp/header/cstddef
namespace std
{
typedef decltype(nullptr) nullptr_t; // (since C++11)
// OR (same thing, but using the C++ keyword using
instead of the C and C++
// keyword typedef
):
using nullptr_t = decltype(nullptr); // (since C++11)
} // namespace std
Referenzen:
- Cprogramming.de: Bessere Typen in C++11 - nullptr, enum-Klassen (stark typisierte Aufzählungen) und cstdint
- https://en.cppreference.com/w/cpp/language/decltype
- https://en.cppreference.com/w/cpp/types/nullptr_t
- https://en.cppreference.com/w/cpp/header/cstddef
- https://en.cppreference.com/w/cpp/keyword/using
- https://en.cppreference.com/w/cpp/keyword/typedef