Question

J'ai consulté un didacticiel qui utilise une construction I pas vu auparavant:

 (void) new QShortcut(Qt::Key_Enter, this, SLOT(fire()));
 (void) new QShortcut(Qt::Key_Return, this, SLOT(fire()));
 (void) new QShortcut(Qt::CTRL + Qt::Key_Q, this, SLOT(close()));

J'ai essayé ceci sans le (void) et il continue de compiler et de fonctionner. Quel est donc le but de (void) ?

Était-ce utile?

La solution

Transtyper une expression en (void) indique au compilateur d'ignorer le résultat de cette expression (après l'avoir calculée).

Dans votre exemple, chacune des expressions (par instruction / ligne) alloue dynamiquement de la mémoire via le nouvel opérateur - et puisque new renvoie un pointeur (adresse) à la mémoire, la pratique habituelle consiste à stocker ce pointeur dans une variable. que vous pouvez utiliser pour supprimer éventuellement l’objet et désallouer la mémoire. Dans votre exemple, étant donné que le pointeur est ignoré, une conversion explicite en (void) clarifie l'intention du programmeur: "Je sais exactement ce que je suis en train de faire. Veuillez ignorer la valeur renvoyée par le nouveau"

.

Si vous êtes intéressé par les détails techniques (citant le standard C ++, clause 5):

  

Toute expression peut être explicitement convertie en type cv void. La valeur de l'expression est ignorée. [Remarque: toutefois, si la valeur se trouve dans une variable temporaire (12.2), le destructeur de cette variable n'est exécuté que jusqu'à l'heure habituelle et la valeur de la variable est conservée dans le but d'exécuter le destructeur. & # 8212; note de fin]
  Les conversions standard lvalue-rvalue (4.1), tableau-pointeur (4.2) et fonction-pointeur (4.3) ne sont pas appliquées à l'expression.

Et si vous vous demandez comment ces objets sont supprimés (si effectivement ils sont supprimés), la réponse est que le pointeur 'this' dans le constructeur de QShortcut devrait avoir la même valeur que celui renvoyé par new, et que peut être passé à un ShortcutManager. Notez que le "this" dans le constructeur n’est pas identique au pointeur "this" transmis au constructeur de QShortcut.

Autres conseils

Certains compilateurs C ++ donneront un avertissement si vous jetez la valeur de retour d’une fonction comme celle-ci. Dans ce cas, le code ressemble à une fuite de mémoire. Vous recevez donc un avertissement. Le (void) indique au compilateur de ne pas émettre l'avertissement: "Traitez cette fonction comme si elle renvoyait void ".

Je pense que la référence renvoyée par l'instruction new n'est pas affectée à un pointeur. Je vois que ce est en train d'être transmis. QT doit donc faire quelque chose avec cette référence.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top