| void is not a subtype of all types, though. C and C++ don't have a type spindle, where void would be at the bottom. Only C++ has the concept of subtype, only in the class system, and the C++ class system doesn't have a bottom type; there is no bottom class that is a base for all the others. void is not a proper type; it's just a hack shoehorned into a convenient spot in the type system. Which is why the C++ people have to invent this whole zoo of other things. If void were a type, then, for starters, "return x;" would be syntactically valid in a function returning void. (Only, no possible x would satisfy the type system, so there would have to be a diagnosable rule violation in that regard.) A function returning void does not return a type. It doesn't return anything; it is a procedure invoked for side effects. The same situation could be achieved in other ways, like having a procedure keyword instead of void. The (void) parameter list is another example of void just being a hack. It was introduced in ISO C, and then C++ adopted it for compatibility. The 2023 draft of ISO C finally made () equivalent to (void), though it will probably take many decades for (void) to disappear. |
A bottom type is not the base of all other types.
> void is not a proper type; it's just a hack shoehorned into a convenient spot in the type system.
It is a type, but it is not Regular and it is incomplete. 'return x;' is invalid in a void-returning function because it doesn't type check. 'return void()' or 'return (void)0;' or 'return void_returning_function();' are all valid because they type check.
Making void regular has been proposed multiple times [1]. It is a relatively simple extension but nobody that cares has the time to carry it through standardization.
[1] https://open-std.org/JTC1/SC22/WG21/docs/papers/2016/p0146r1...