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
Ceci est une instance du problème "safe bool".
Voici un bon article: http://www.artima.com/cppsource/safebool.html.
C++ 0x aide la situation avec les fonctions de conversion explicit
, ainsi que la modification mentionnée par Kristo. Voir également Is the safe-bool idiom obsolete in C++11?.
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 enint
.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 avecbool
ne sont pas autorisés, ce qui élimine certaines sources d'erreur utilisateur .
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.
'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
Cette réponse est obsolète. Il n'a pas été standardisé car des fonctions de conversion explicites ont été ajoutées. – Potatoswatter