Comment std :: ostringstream se convertirait-il en bool?
-
08-07-2019 - |
Question
Je suis tombé sur ce code.
std::ostringstream str;
/// (some usage)
assert( ! str );
Que signifie ostringstream
lorsqu'il est utilisé dans un contexte bool
?
S'agit-il probablement d'une utilisation incorrecte lors de la compilation et de l'exécution?
La solution
Il vous indique si le flux est actuellement valide. C'est quelque chose que tous les flux peuvent faire. Un flux de fichiers, par exemple, peut ne pas être valide si le fichier n'a pas été ouvert correctement.
Notons que cette fonctionnalité (tester un flux en tant que booléen) est obtenue en surchargeant opérateur explicite bool
en C ++ 11 et versions ultérieures et en surchargeant void *
opérateur de conversion dans les versions antérieures à C ++ 11 .
Voici un lien contenant quelques exemples de la raison un flux peut échouer . Ce n'est pas spécifique aux flux de chaînes, mais cela s'applique à eux.
Modifier: a remplacé bool
par void *
après que Martin York eut signalé mon erreur.
Autres conseils
Pour référence: ostringstream :: operator void * () et ostringstream :: operator! () .
L'expression est valide et évalue l'état du flux. Cette fonctionnalité est plus couramment utilisée sur les flux d'entrée:
istringstream is;
is.str( "foo" );
int x;
is >> x;
if ( ! is ) {
cerr << "Conversion failed";
}
Je ne suis pas sûr que l’une quelconque des fonctions de streaming standard puisse gâcher un flux transparent, mais vous pouvez certainement en écrire un vous-même.