Warum wird "operator void" nicht mit der Cast-Syntax aufgerufen?

33

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?

    
sharptooth 27.10.2010, 08:30
quelle

1 Antwort

26

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:

%Vor%

Es ist technisch immer noch potentiell nützlich für etwas , also ist es vielleicht vernünftig genug, es nicht schlecht geformt zu machen.

    
GManNickG 27.10.2010, 09:03
quelle