The technical reason why is found in §12.3.2:
A conversion function is never used to convert a (possibly cv-qualified) object to the (possibly cv-qualified) same object type (or a reference to it), to a (possibly cv-qualified) base class of that type (or a reference to it), or to (possibly cv-qualified) void.
The rationale is (likely) to allow §5.2.9/4 to work:
Any expression can be explicitly converted to type “cv void.” The expression value is discarded.
(void)expr
to suppose to do nothing for the resulting value of any expression, but if it called your conversion operator it wouldn't be discarding anything. So they ban the use of operator void
in conversions.
Why not make it ill-formed to have the conversion-type-id be void
? Who knows, but keep in mind it's not totally useless:
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)
It is still technically potentially useful for something, so maybe that's rationale enough not to make it ill-formed.
operator int()
and I wrote(int)object;
thenoperator int()
would be invoked. Turns out this isn't the case withoperator void()
, so I asked this question. – Bolognaconversion to void will never use a type conversion operator
– Intimacy