2010-10-27 8 views
33

Während mit this answer von user GMan spielen ich den folgenden Ausschnitt gefertigt (mit Visual C++ 9 kompiliert):Warum wird "Operator void" nicht mit Cast-Syntax aufgerufen?

class Class { 
public: 
    operator void() {} 
}; 

Class object; 
static_cast<void>(object); 
(void)object; 
object.operator void(); 

, nachdem ich das nicht Class::operator void(), die dritte nur berufen sich auf void Casting gefunden mit dem Debugger stieg über out Invokation (mit explizitem Aufruf des Operators) ruft den Operator tatsächlich auf, die beiden Casts tun einfach nichts.

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

+4

Ich liebe wie du immer komische aber interessante Fragen stellst;) Hier ist mein +1. – ereOn

+0

Welchen Code würden Sie erwarten, ohne * die Besetzung ausgeführt zu werden? Eigentlich keiner ... wieso sollte Casting das ändern? – Eiko

+2

@Eiko: Wenn das "operator int()" wäre und ich '(int) object;' geschrieben hätte, würde 'operator int()' aufgerufen werden. Es stellt sich heraus, dass dies mit 'operator void()' nicht der Fall ist, also habe ich diese Frage gestellt. – sharptooth

Antwort

26

Der technische Grund, warum in §12.3.2 gefunden:

A-Umwandlungsfunktion verwendet wird nie ein (möglicherweise cv-qualifiziert) Objekt des (möglicherweise cv-qualifiziert) gleichen Objekttyp zu umwandeln (oder eine Referenz darauf), auf eine (möglicherweise cv-qualifizierte) Basisklasse dieses Typs (oder eine Referenz darauf), oder auf (möglicherweise cv-qualifizierte) void.

Das Grundprinzip ist (wahrscheinlich) §5.2.9/4 zur Arbeit zu ermöglichen:

Jeder Ausdruck explizit umgewandelt werden kann, um Typen Der Ausdruckswert verworfen wird „cv nichtig.“.

(void)expr anzunehmen, nichts für den resultierenden Wert von jeden Ausdruck zu tun, aber wenn es Ihren Conversion-Operator genannt wäre es nicht etwas zu verwerfen. Sie verbieten also die Verwendung von operator void in Konvertierungen.


Warum es nicht machen schlecht gebildet void die Umwandlung Typ-ID zu haben? Wer weiß, aber denken Sie daran, es ist nicht völlig nutzlos:

struct foo 
{ 
    operator void() 
    { 
     std::cout << "huh?" << std::endl; 
    } 

}; 

typedef void (foo::*void_function)(); 

foo f; 
void_function func = &foo::operator void; 

(f.*func)(); // prints "huh" 
f.operator void(); // also does (which you knew) 

Es ist immer noch technisch potentiell nützlich für etwas, so vielleicht ist das Grundprinzip nicht genug es schlecht gebildet zu machen.

+4

* "Warum sollte man es nicht schlecht machen, wenn die Konvertierungstyp-ID 'ungültig' ist?" * Vielleicht, weil diese 'void' hinter einem typedef- oder template-Parameter versteckt ist? – dyp

Verwandte Themen