Est !! un moyen sûr de se convertir à bool en C++?

[Cette question est liée mais n'est pas le même que cette une.]

Si j'essaie d'utiliser des valeurs de certains types d'expressions booléennes, je reçois un avertissement. Plutôt que de supprimer l'avertissement, j'ai parfois l'utilisation de l'opérateur ternaire (?:) pour convertir un bool. À l'aide de deux pas des opérateurs (!!) semble faire la même chose.

Voici ce que je veux dire:

typedef long T;       //similar warning with void * or double
T t = 0;
bool b = t;           //performance warning: forcing 'long' value to 'bool'
b = t ? true : false; //ok
b = !!t;              //any different?

Donc, ne le double pas de technique vraiment faire la même chose? Est-il plus ou moins sûr que le ternaire technique? Est cette technique également sans danger avec les types intégraux (par exemple, avec void * ou double pour T)?

Je ne suis pas demander si !!t est un bon style. Je me demande si il est sémantiquement différent de t ? true : false.

  • Quand je vois une ligne comme "b = t ? true : false;" je suis toujours tenté de la remplacer par la ligne "b = t". Il y a déjà un cast implicite de bool, pourquoi mâche de la sémantique?
  • comme le Q dit, parce que b=t donne un avertissement
  • intéressant de voir comment beaucoup de gens sont contre !! sur la base subjective. double négation est la idiomatiques cast-à-bool véhicule en JavaScript, et si javascripters l'obtenir, je m'attends à C++ utilisateurs de trop.
  • double négation est commun dans la plupart des langages de script stackoverflow.com/questions/524658/what-does-mean-in-ruby Donc, l'utilisation dans un cadre de haut niveau, compréhensible code(au moins par l'écrivain lui-même) est strictement interdite.. 🙂
  • Un, ce serait le cas lors de l'affectation d'une valeur à un champ de drapeau dans une struct. Votre solution doit tronquer (au moins dans certains compilateurs), tandis que le reste est proposé ici serait le drapeau à la valeur de vérité. En supposant que le compilateur va faire la bonne chose (pour vous) n'est pas la chose la plus intelligente. Et le réglage de la bit-champ de type booléen ne change pas (au moins avec le compilateur, je m'occupe). Comportement indéfini.
InformationsquelleAutor jwfearn | 2008-10-15