2009-08-26 16 views
9

Dans this answer Je parle de l'utilisation d'une conversion de l'objet std::ifstream à bool pour tester si le flux est toujours dans un bon état. J'ai regardé dans le livre de Josuttis pour plus d'informations (page 600 si vous êtes intéressé), et il s'avère que les objets iostream surchargent effectivement operator void*. Il retourne un pointeur nul lorsque le flux est mauvais (qui peut être implicitement converti en false), et un pointeur non nul sinon (implicitement converti en true). Pourquoi ne pas simplement surcharger operator bool?Pourquoi les objets iostream ne surchargent-ils pas l'opérateur bool?

Répondre

13

Il semble que la section 27.4.4.3 du standard C++ 0x ait la réponse (emphase mienne).

operator unspecified-bool-type() const; 

Retours: Si fail() alors une valeur qui évaluera faux dans un contexte booléen ; sinon, une valeur évalue true dans un contexte booléen. Le type de valeur renvoyé ne doit pas être convertible en int.

Note: Cette conversion peut être utilisé dans des contextes où un bool est ATTENDUS (par exemple, si une condition); Toutefois, conversions implicites (par exemple, à int) qui peuvent se produire avec bool ne sont pas autorisés, ce qui élimine certaines sources d'erreur utilisateur .

+0

Cette réponse est obsolète. Il n'a pas été standardisé car des fonctions de conversion explicites ont été ajoutées. – Potatoswatter

-1

Le plus récent 11 C++ exige que:

explicit operator bool() const; 

Voir C++ 11 27.5.5.4-1. Le 'explicite' me semble étrange.

+1

'explicite' est la raison pour laquelle il a été ajouté. Une telle fonction de conversion 'explicite 'ne s'appliquera que s'il s'agit de la conversion * only *, dans ce cas elle convertira' iostream' en 'bool' mais pas' int' via une conversion intermédiaire 'bool'. Lisez les autres réponses sur cette page pour en apprendre davantage sur le Safe Bool Idiom. – Potatoswatter