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.
Ich liebe wie du immer komische aber interessante Fragen stellst;) Hier ist mein +1. – ereOn
Welchen Code würden Sie erwarten, ohne * die Besetzung ausgeführt zu werden? Eigentlich keiner ... wieso sollte Casting das ändern? – Eiko
@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