Function pointers aren't convertible to data pointers. You'd get a compiler error if you were to try and assign one to a void*
variable. But they are implicitly convertible to bool
!
That is why the bool
overload for operator<<
is chosen over the const void*
one.
To force the overload you want, you'd need to use a very strong C++ cast, that will almost completely ignore the static type information.
#include <iostream>
int add(int x, int y) { return x + y; }
int main()
{
int (*func_ptr)(int,int) = add;
std::cout << "The address of function add() is: "
<< reinterpret_cast<void*>(func_ptr)
<< std::endl;
}
See live example at Compiler Explorer
Note that casting and treating function pointers as data pointers is only conditionally supported (from the C++ standard standpoint). Using it for anything other than casting back to the same function pointer will have an implementation specific outcome, that can very greatly among compilers.