Погодите, там даже интереснее
8.5.1.10.8:
Converting a function pointer to an object pointer type or vice versa is conditionally-supported. The meaning of such a conversion is implementation-defined, except that if an implementation supports conversions in both directions, converting a prvalue of one type to the other type and back, possibly with different cv-qualification, shall yield the original pointer value.
"Conditionally supported" != "implementation defined". Если реализация поддерживает такой каст, то он должен сработать ожидаемо