Der Code ist konform. Der explizite Konvertierungsoperator in %code% wird aufgerufen, wenn das Objekt automatisch als -Bedingung verwendet wird. Die Änderung des Standards sollte den gleichen Gebrauch beibehalten und gleichzeitig etwas sicherer machen.
%code% (und nur %code% ) hat eine spezielle Sprache, die es ermöglicht, dass sie implizit in eine %code% in bestimmten Umständen umgewandelt wird. Die Spezifikationssprache für diese Konvertierung wird "kontextuell in %code% " konvertiert.
Dies sind die Orte, an denen die Sprache boolesche Tests durchführt. Der von %code% verwendete bedingte Ausdruck wird "kontextuell in %code% " konvertiert. Ebenso wie die logischen Operatoren und der bedingte Operator ( %code% ).
So, während Sie diese nicht tun können:
%Vor%Sie können dies tun:
%Vor%Ich überprüfte den C ++ 11-Standard und fand folgende Fakten:
%code% gibt ein %code% -Objekt zurück, dessen Klasse eine Mitgliedsfunktion %code%
Die Klasse %code% hat keine Memberfunktion %code% als pre-C ++ 11.
Also, ich denke, dass %code% nicht standardkonform ist. Es sollte als
geschrieben werden%code% . (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 %code% , in den Operanden in %code% und in der Bedingung in %code% .
So kann
Ein Ausdruck e kann implizit in einen Typ %code% konvertiert werden, wenn und nur wenn Die Deklaration %code% 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 %code% wohlgeformt ist , für einige erfundene temporäre Variablen %code% (8.5) ...
Wie Sie sehen können, gibt der Standard eine direkte Initialisierung für kontextabhängige Conversions vor, weshalb explizite Konvertierungen in %code% conditions funktionieren.