Ist "if (getline (fin, str)) {}" konform mit dem C ++ 11 Standard?

7

Ich überprüfte den C ++ 11-Standard und fand folgende Fakten:

  1. std::getline(fin, str) gibt ein basic_ios -Objekt zurück, dessen Klasse eine Mitgliedsfunktion explicit operator bool() const;

  2. hat
  3. Die Klasse basic_ios hat keine Memberfunktion operator void*() const; als pre-C ++ 11.

Also, ich denke, dass if (getline(fin, str)) {} nicht standardkonform ist. Es sollte als

geschrieben werden

if (bool(getline(fin, str)){} . (VC ++ 2012 warnt jedoch vor dieser Verwendung. D. H. Force void * to bool)

Habe ich Recht?

    
xmllmx 06.02.2013, 03:18
quelle

3 Antworten

6

David hat Recht, und hier sind die Zitate, um ihn zu unterstützen. In §12.3.2 / 2 heißt es im Standard

  

Eine Konvertierungsfunktion kann explizit (7.1.2) sein, in diesem Fall wird sie nur als a betrachtet   benutzerdefinierte Konvertierung für direkte Initialisierung (8.5). Andernfalls benutzerdefinierte Konvertierungen   sind nicht auf die Verwendung in Zuweisungen und Initialisierungen beschränkt. [ Beispiel :

%Vor%      

- Ende Beispiel ]

Einige Stellen, an denen diese kontextabhängige Konvertierung stattfindet, befinden sich im Operanden in ! , in den Operanden in && und in der Bedingung in if .

So kann Initialisierung von expliziten Konvertierungsoperatoren und in §4 / 3

verwendet werden
  

Ein Ausdruck e kann implizit in einen Typ T konvertiert werden, wenn und nur wenn   Die Deklaration T t=e; ist wohlgeformt, für einige erfundene temporäre   Variable t (8.5). Bestimmte Sprachkonstrukte erfordern, dass a   Ausdruck wird in einen booleschen Wert umgewandelt. Ein Ausdruck e erscheint   In einem solchen Kontext wird gesagt, dass es kontextabhängig in bool umgewandelt wird und ist   wohlgeformt, wenn und nur wenn die Deklaration bool t(e); wohlgeformt ist ,   für einige erfundene temporäre Variablen t (8.5) ...

Wie Sie sehen können, gibt der Standard eine direkte Initialisierung für kontextabhängige Conversions vor, weshalb explizite Konvertierungen in if conditions funktionieren.

    
Seth Carnegie 06.02.2013, 04:20
quelle
12

Der Code ist konform. Der explizite Konvertierungsoperator in bool wird aufgerufen, wenn das Objekt automatisch als -Bedingung verwendet wird. Die Änderung des Standards sollte den gleichen Gebrauch beibehalten und gleichzeitig etwas sicherer machen.

    
quelle
8

explicit operator bool (und nur explicit operator bool ) hat eine spezielle Sprache, die es ermöglicht, dass sie implizit in eine bool in bestimmten Umständen umgewandelt wird. Die Spezifikationssprache für diese Konvertierung wird "kontextuell in bool " konvertiert.

Dies sind die Orte, an denen die Sprache boolesche Tests durchführt. Der von if/while/for verwendete bedingte Ausdruck wird "kontextuell in bool " konvertiert. Ebenso wie die logischen Operatoren und der bedingte Operator ( ?: ).

So, während Sie diese nicht tun können:

%Vor%

Sie können dies tun:

%Vor%     
Nicol Bolas 06.02.2013 04:21
quelle