Wann Q_NULLPTR?
Sehe ich Q_NULLPTR
verwendet wird liberal in der Qt source code und Beispiele, aber ich finde keine Dokumentation, was es genau ist und wenn es verwendet werden soll.
Beispielsweise in diesem offiziellen demonstration der neuen Qt-SerialBus-Modul Hinzugefügt in die neue Qt-v5.6:
if (!m_canDevice->connectDevice()) {
delete m_canDevice;
m_canDevice = Q_NULLPTR;
Tat dies dem Zweck dienen nullptr
vor, die Hinzugefügt wird in C++11? Wenn dem so ist, nun, dass wir C++11, soll ich mich mit Q_NULLPTR
?
PS: ich habe versucht, die Suche der Qt source code für die definition des Makros, scheiterte aber um es zu finden.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja (etwas) und Keine bzw.
C++ war Recht fehlt, zurück in die Tage, also Qt hatte seine eigenen Sachen, die später hinfällig wurde als C++ - gefangen bis auf die features.
Dass gesagt wird, die
Q_NULLPTR
ist (war) nicht funktional das gleiche wienullptr
(als Andrei bemerkte, wenn C++11 unterstützt, es wird erweitert, umnullptr
) es hat nicht geben Ihnen die Sicherheit, nur syntax "Zucker". Es illustriert die Absicht, die person liest den code, nicht an den compiler alsnullptr
tut.Q_NULLPTR
ist ein makro, ersetzt wird, wienullptr
wenn der compiler unterstützt c++11 und alsNULL
(die ersetzt wird, wie0
), wenn nicht. Wenn Sie c++11, können Sie schreibennullptr
statt; verwenden SieNULL
wenn Sie nicht.Verwenden
Q_NULLPTR
zu bleiben compiler unabhängig.Wenn Sie nun entscheiden, zu verwenden
nullptr
, der code wird nicht kompilieren, die mit einer älteren c++98-compiler. Wenn Sie sich entscheiden, zu verwendenNULL
werden, verlieren Sie die c++11-Art der Sicherheit, auch wenn Sie in Ihrem aktuellen compiler.Für die gleichen Grund-Makros wie
qMove(x)
und die entsprechende definierenQ_COMPILER_RVALUE_REFS
vorhanden ist.Eigentlich
Q_NULLPTR
hatte nur einen Zweck: erlaubt die Verwendung vonnullptr
ohne verlieren support für Compiler, die nicht über C++11/C++0x unterstützen, wie eine direkte Nutzung vonnullptr
würde zu Fehlern führen, in solchen setups. Der Nachteil ist, dass es Unklarheiten seiner fallback aufNULL
(oder0
in älteren Qt-Versionen), die möglicherweise unbeabsichtigte-runtime-Verhalten und Begrenzung der unterstützten use cases im Vergleich zunullptr
.In dem seltenen Fall, dass Sie den Gegner nicht C++11-kompatiblen Compiler, verwenden Sie
Q_NULLPTR
aber stellen Sie sicher, dass der code funktioniert gut, wenn C++11-features deaktiviert sind. In allen anderen Situationennullptr
ist die bessere alternative, da es die Ergebnisse in der Zusammenstellung Fehler anstelle von buggy-Laufzeit Verhalten bei Verwendung mit älteren Compilern. Qt 5.7 und höher sank die Unterstützung für die Kompilierung ohne C++11 so gibt es keine Notwendigkeit fürQ_NULLPTR
wenn Sie hängen an diese Versionen.Es gibt andere features wie
qMove
oderQ_DECL_OVERRIDE
geben, eine verbesserte semantische, wenn verwendet, auf die Unterstützung des compilers, ohne zu brechen Zusammenstellung auf älteren Compilern.