Ich überprüfte den C ++ 11-Standard und fand folgende Fakten:
std::getline(fin, str)
gibt ein basic_ios
-Objekt zurück, dessen Klasse eine Mitgliedsfunktion explicit operator bool() const;
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
if (bool(getline(fin, str)){}
. (VC ++ 2012 warnt jedoch vor dieser Verwendung. D. H. Force void * to bool)
Habe ich Recht?
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
Ein Ausdruck e kann implizit in einen Typ
T
konvertiert werden, wenn und nur wenn Die DeklarationT 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 Deklarationbool t(e);
wohlgeformt ist , für einige erfundene temporäre Variablent
(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.
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.
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%Tags und Links c++ c++11 iostream type-conversion explicit-conversion