Beim Spielen mit diese Antwort von Benutzer GMan Ich habe das folgende Snippet (kompiliert mit Visual C ++ 9) erstellt:
%Vor% Nachdem ich mit dem Debugger übergegangen bin, habe ich herausgefunden, dass Casting auf void
Class::operator void()
nicht aufruft, nur die dritte Invokation (mit explizitem Aufruf des Operators) ruft tatsächlich den Operator auf, die beiden Casts tun einfach nichts.
Warum wird das operator void
nicht mit der Cast-Syntax aufgerufen?
Der technische Grund dafür findet sich in §12.3.2:
Eine Konvertierungsfunktion wird niemals verwendet, um ein (möglicherweise cv-qualifiziertes) Objekt in den (möglicherweise cv-qualifizierten) gleichen Objekttyp (oder einen Verweis darauf) in eine (möglicherweise cv-qualifizierte) Basisklasse davon umzuwandeln Typ (oder eine Referenz darauf), oder (möglicherweise cv-qualifiziert) void .
Die Begründung ist (wahrscheinlich), dass §5.2.9 / 4 funktioniert:
Jeder Ausdruck kann explizit in den Typ "cv void" konvertiert werden. Der Ausdruckswert wird verworfen.
(void)expr
, um nichts für den resultierenden Wert von any auszudrücken, aber wenn er Ihren Konvertierungsoperator aufgerufen hätte, würde er nichts verwerfen. Daher verbieten sie die Verwendung von operator void
in Conversions.
Warum sollte es nicht schlecht aussehen, wenn die Conversion-Type-ID void
ist? Wer weiß, aber denken Sie daran, es ist nicht total nutzlos:
Es ist technisch immer noch potentiell nützlich für etwas , also ist es vielleicht vernünftig genug, es nicht schlecht geformt zu machen.
Tags und Links c++ casting operator-overloading operators