Je vois que Q_NULLPTR
est utilisé généreusement dans le code source Qt et dans les exemples, mais je n’ai trouvé aucune documentation indiquant exactement ce que c’est et quand il devrait être utilisé.
Par exemple, dans ce demonstration du nouveau module Qt SerialBus ajouté dans le nouveau Qt v5.6:
if (!m_canDevice->connectDevice()) {
delete m_canDevice;
m_canDevice = Q_NULLPTR;
Cela a-t-il servi à nullptr
avant que cela soit ajouté dans C++ 11? Si c'est le cas, maintenant que nous avons le C++ 11, devrais-je utiliser Q_NULLPTR
?
PS: J'ai essayé de chercher la définition de la macro dans le code source Qt mais je n'ai pas réussi à la trouver.
Cela a-t-il servi à nullptr avant d'être ajouté dans C++ 11? Si c'est le cas, maintenant que nous avons C++ 11, devrais-je utiliser Q_NULLPTR?
Oui (un peu) et non respectivement.
Le C++ manquait beaucoup à l'époque, alors Qt avait son propre matériel, qui devint plus tard obsolète car le C++ rattrapait ses fonctionnalités.
Ceci étant dit, Q_NULLPTR
n'est pas (était) fonctionnellement identique à nullptr
((comme Andrei l'a noté, si C++ 11 est pris en charge, il se développe en nullptr
), il ne vous a pas donné le type sécurité, juste la syntaxe "sugar". Cela illustre l'intention de la personne qui lit le code, et non du compilateur comme le fait nullptr
.
Q_NULLPTR
est une macro qui est remplacée par nullptr
si le compilateur prend en charge c ++ 11 et par NULL
(qui est remplacée par 0
) si ce n'est pas le cas. Si vous utilisez c ++ 11, vous pouvez écrire nullptr
à la place; utilisez NULL
si vous ne le faites pas.
Utilisez Q_NULLPTR
pour rester indépendant du compilateur.
Si vous décidez maintenant d'utiliser nullptr
, votre code ne sera pas compilé avec un compilateur c ++ 98 plus ancien. Si vous décidez d'utiliser NULL
, vous perdez la sécurité de type c ++ 11, même si elle est disponible dans votre compilateur actuel.
Pour la même raison, des macros telles que qMove(x)
et la définition correspondante Q_COMPILER_RVALUE_REFS
existent.
En fait, Q_NULLPTR
n’avait qu’un seul but: autoriser l’utilisation de nullptr
sans perdre le support des compilateurs n’ayant pas de support C++ 11/C++ 0x, car une utilisation directe de nullptr
entraînerait des erreurs dans de telles configurations. L'inconvénient est que le repli sur NULL
(ou 0
dans les versions antérieures de Qt) présente des ambiguïtés, ce qui peut entraîner un comportement inattendu à l'exécution et limiter les cas d'utilisation pris en charge par rapport à nullptr
.
Dans les rares cas où vous ciblez des compilateurs non conformes à C++ 11, utilisez Q_NULLPTR
mais assurez-vous que le code fonctionne correctement lorsque les fonctionnalités de C++ 11 sont désactivées. Dans toutes les autres situations, nullptr
est la meilleure solution car il en résulte des erreurs de compilation au lieu d'un comportement d'exécution bogué lorsqu'il est utilisé avec des compilateurs hérités. Qt 5.7 et les versions ultérieures ont abandonné la prise en charge de la compilation sans C++ 11, si bien que Q_NULLPTR
n'est pas nécessaire si vous dépendez de ces versions.
Il existe d'autres fonctionnalités telles que qMove
ou Q_DECL_OVERRIDE
qui améliorent la sémantique lorsqu'elles sont utilisées sur des compilateurs compatibles sans interrompre la compilation sur des compilateurs plus anciens.