web-dev-qa-db-fra.com

Quand utiliser Q_NULLPTR?

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.

14
DBedrenko

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.

13
dtech

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.

17
Andrei R.

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.

2
Martin Hennings

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.

1
Johannes Matokic