The language doesn't allow auto conversion of a pointer to a function to a void pointer.
Here's what the C++ Draft Standard (N3337) says about pointer conversion (emphasis mine):
4.10 Pointer conversions
2 An rvalue of type “pointer to cv T
,” where T
is an object type, can be converted to an rvalue of type “pointer to cv void
.” The result of converting a “pointer to cv T
” to a “pointer to cv void
” points to the start of the storage location where the object of type T
resides, as if the object is a most derived object (1.8) of type T
(that is, not a base class subobject).
Functions are not objects. This is stated in:
1.8 The C+ + object model
1 The constructs in a C + + program create, destroy, refer to, access, and manipulate objects. An object is a region of storage. [Note: A function is not an object, regardless of whether or not it occupies storage in the way that objects do. ]
Object type is defined as:
3.9 Types
9 An object type is a (possibly cv-qualified) type that is not a function type, not a reference type, and not a void type.