7
votes

Pourquoi ne puis-je pas utiliser l'opérateur bool () pour std :: destream

Pourquoi ne puis-je pas écrire le code suivant? XXX PRE>

SORTIE STRAND> P>

prog.cpp: In function 'bool touch(const string&)':
prog.cpp:6:52: error: cannot convert 'std::ofstream {aka std::basic_ofstream<char>}' to 'bool' in return
  return std::ofstream(file_path, std::ios_base::app);


3 commentaires

Comme l'opérateur est explicite et qu'il n'y a pas de contexte à convertir à Bool implicitement, vous devez convertir explicitement BOOL. :)


Explicit ne fait pas convertir à Bool, sauf si vous invoquez directement CAST.


retour !! fonctionne ici.


3 Réponses :


13
votes

C'est exactement parce que opérateur bool () est défini comme explicite que vous ne pouvez pas l'utiliser de cette manière. Le seul contexte où un opérateur bool () est automatiquement appelé est destiné à des conditionnels sans ambiguïtés, tels que si pendant , ?: < / Code>, ! et l'expression médiane de pour . (Pour un résumé plus complet, voir ma question quand puis-je utiliser Explicit Opérateur BOOL SANS CAST? ).

a Retour La valeur de l'instruction n'est jamais convertie contextuellement en bool , donc si vous souhaitez convertir std :: destream to BOOL comme valeur de retour, vous devez utiliser utiliser static_cast () ou équivalent.


0 commentaires

3
votes

Comme l'opérateur est déclaré comme explicite et qu'il n'existe aucun contexte qui permet de convertir implicite à Bool (comme par exemple l'utilisation de l'instruction IF), vous devez convertir l'expression avec le flux vers bool explicitement. Par exemple xxx


0 commentaires

0
votes

La définition de opérateur bool ressemble à ceci: xxx

Notez l'utilisation de Explicit ici, cela signifie qu'il n'y a pas de casting automatique de la classe à Bool. Cela signifie que pour votre code, vous devez le faire: xxx

Peu importe quoi, une distribution est requise (de préférence static_cast ), en raison de la conversion implicite étant dangereuse.


0 commentaires